2

私のコードでは、次の初期化を行います。

struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
        .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };

int initPipe()
{
    if (!myPipe.init)
    {
        myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);

        if (!sem_init (myPipe.mutex, 1, 0))  // semaphore is initialized to 0
        {
            myPipe.init = TRUE;
        }
        else
            perror ("initPipe");
    }
    return 1;   // always successful
}

( forkmain()に注意してください)から呼び出すことができる複数のプロセスを持つことができます。

ありがとう

4

1 に答える 1

1

AFAICS エラーは制御変数にあります。変数のみmutexがプロセス間で共有され、変数や変数は共有されませinitflag。これらは書き込み時にコピーされるため、別のプロセスで変更が表示されることはありません。

作成したセグメント内にすべての制御変数をパックする必要があります。struct必要なすべてのフィールドに適切なタイプを作成します。

ところで、セマフォを呼び出すのmutexは本当に悪い考えです。ミューテックスには、セマフォとはまったく異なる意味があります。(または、実際にミューテックスとして使用する場合は、チェックしませんでした。初期化子pthread_mutex_tで withpsharedを使用します。)

編集後に編集:いいえ、このようには機能しません。全体structを共有セグメントに配置する必要があります。したがって、 aではなく a をstruct PipeShm含める必要があります。次に、次のようなことをしますsem_t semsem_t* mutex

struct PipeShm * myPipe = 0;

int initPipe()
{
    if (!myPipe->init)
    {
        myPipe = mmap (NULL, sizeof *myPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);

        if (!sem_init (myPipe->sem, 1, 0))  // semaphore is initialized to 0
        {
            myPipe->init = true;
        }
        else
            perror ("initPipe");
    }
    return 1;   // always successful
}

その他の注意事項:

  • インターフェイスは、sem_tあらゆる種類の IO またはその他の信号によって中断される可能性があります。これらの関数の戻り値を常に確認し、特に関数が を受け取った場合は再起動する必要がありEINTRます。
  • Mondern C にはブール値があります。これは、 、 、の<stdbool.h>名前を通して含めることで簡単に使用できます 。boolfalsetrue
于 2012-07-29T10:49:01.097 に答える