0

C で親子プロセスを作成していますが、これらのプロセスは文字の配列を共有メモリとして使用しており、この順序で実行したいと考えています。

親->子->親->子->親->子

....など、私はWait(NULL)親で使用していますが、実行は次の順序で行われます

親→子→親→親→親 ....

私はセマフォなしでこれをやろうとしていますが、それ以外はまだ初心者の Linux プログラマーです。

int main(void)
{
    if (fork( ) == 0)
    { //child
        if( (id = shmget(key, sizeof(char[n]), 0)) == -1 )
        {
            exit(1);
        }
        shm = shmat(id, 0, 0);
        if (shm == (char *) -1)
            exit(2);
        .......................//some work
        ..........................
    }
    else //parent
    {
            if( (id = shmget(key, sizeof(char[n]), 0666 | IPC_CREAT)) == -1 )
            {
                exit(1);
            }
            shm = shmat(id, 0, 0); //attach shared memory to pointer
            if (shm == (char *) -1)
                exit(2); //error while atatching
                        ....
                        .....
        do
        {
            //parent turn here
            wait(NULL);
                        ....................................
                        //some work ..................
        }
        while(done!=1);
        shmdt(NULL);
        if( shmctl(id, IPC_RMID, NULL) == -1 )//delete the shared memory
        {
            perror("shmctl");
            exit(-1);
        }
    }
    exit(0);
}
4

1 に答える 1

1
  1. fork() を呼び出す前に shmget(IPC_CREAT) を呼び出すことをお勧めします。これは、POSIX は呼び出し後の実行順序を保証しないため、子プロセスの shmget() が失敗する可能性があるためです。共有セグメントを作成します。

  2. wait() は、子プロセスが終了するのを待ちます。親プロセスと子プロセスの間のスケジュールには使用されません。

  3. 正確には、何をしようとしているのですか?

于 2013-02-19T22:44:20.613 に答える