Детски процес изчаква родител, след което се изпълнява и след това обратно в C linux

I'm creating a parent-child process in C and these processes are using an array of characters as a shared memory and I want the execution to be in this sequence

родител->дете->родител->дете->родител->дете

.... and so on, i am using Wait(NULL) in parent but the execution go in the sequence of

родител->дете->родител->родител->родител ....

I am trying to do this without semaphores or any ting else am still a novice Linux programmer

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);
}

person Yaser Jaradeh    schedule 19.02.2013    source източник
comment
Ако искате да синхронизирате двата процеса, вие трябва да използвате някакъв механизъм за синхронизиране. Най-простият е тръба.   -  person William Pursell    schedule 20.02.2013


Отговори (1)


  1. Може да искате да извикате shmget(IPC_CREAT), преди да извикате fork(), тъй като POSIX не гарантира реда на изпълнение след извикването, така че shmget() в дъщерния процес може да се провали, защото родителят не е имал шанс да създайте споделения сегмент.

  2. wait() изчаква дъщерен процес да приключи. Не се използва за планиране между родителски и дъщерен процес.

  3. Какво точно се опитваш да направиш?

person Sean Conner    schedule 19.02.2013