运行信号量的意外输出

我正在尝试编写一个程序,它会分叉另一个进程并保持同步,这样第一个进程就不会开始第(i)次迭代,直到第二个进程完成第(i-1)次迭代。 这只能使用两个信号量吗? 这是我到目前为止:

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

我期望的输出是:

 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 

但我只有一个孩子:

 child1: 0 

您可能需要three semaphores

sem1 sem2 sem3

处理1:

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

过程2:

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

注意 :在Initialize the semaphores您必须将信号量映射到shared memory以便两个进程都可以访问它。 还要将它们初始化为某个默认值0, 0, 0