Salida inesperada ejecutando semáforo

Estoy intentando escribir un progtwig que bifurca otro proceso y se mantiene sincronizado para que el primer proceso no inicie su iteración hasta que el segundo proceso finalice su iteración (i-1). ¿Es esto posible usando solo dos semáforos? Esto es lo que tengo hasta ahora:

#include  #include  #include  #include  #include  #include  sem_t semA, semB,sem,m; int main(void) { int i; pid_t child_a, child_b,pid2,pid3; sem_init(&semA, 0, 1); sem_init(&semB, 0, 0); sem_init(&m, 0, 0); child_a = fork(); //wait(); if (child_a == 0) { // int j; pid2 =getpid(); for (i = 0; i < 5; ) { sem_wait(&semA); //sem_wait(&m); printf("child1: %d\n", i); i++; //printf("pid1: %d\n", pid2); //printf("--------------------------\n"); sleep(3); //sem_post(&m); sem_post(&semB); } } else { child_b = fork(); //wait(); if (child_b == 0) { pid3 =getpid(); for (i = 0; i < 5;) { sem_wait(&semB); //sem_wait(&m); printf("child2: %d\n", i); i++; //printf("pid2: %d\n", pid3); //printf("--------------------------\n"); sleep(5); //sem_post(&m); sem_post(&semA); } } } exit(0); return 0; } 

La salida que espero es:

 child1: 0 child2: 0 child1: 1 child2: 1 child1: 2 child2: 2 child1: 3 child2: 3 child1: 4 child2: 4 child1: 5 child2: 5 child1: 6 child2: 6 child1: 7 child2: 7 child1: 8 child2: 8 child1: 9 child2: 9 

pero solo tengo un hijo:

 child1: 0 

Puede que necesites three semaphores .

sem1 sem2 sem3

Proceso1:

 if(FirstRun){ Initialize the semaphores wait for sem2 } post sem1 wait for sem3 

Proceso2:

 if(FirstRun){ Initialize the semaphores post sem2 } wait for sem1 post sem3 

Nota : En Initialize the semaphores , debe asignar los semáforos a una shared memory para que ambos procesos puedan acceder a ellos. También Inicialícelos a algún valor predeterminado, digamos 0, 0, 0 .