Дочерний процесс ждет родителя, затем он выполняется, а затем наоборот в 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