这个问题已经在这里有一个答案:
sem_post()工作不正常,既不增加其信号量的值,也不解除阻塞连接到该信号块队列过程
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
sem_t pa,ch;
sem_init(&pa,1,1);
sem_init(&ch,1,0);
pid_t p1;
p1 = fork();
if(p1>0) //Parent process
{
while(1)
{
sem_wait(&pa);
printf("Parent\n");
sem_post(&ch);
}
}
else if(p1==0)
{
while(1)
{
sem_wait(&ch);
printf("child\n");
sem_post(&pa);
}
}
else
printf("\nError\n");
return 0;
}
预期输出是
Parent
child
Parent
child
Parent
child
.. and so on..
实际产量
Parent
引述man sem_init
:
int sem_init(sem_t *sem, int pshared, unsigned int value);
如果
pshared
为非零,则信号量进程之间共享的,并且应该位于共享存储器的区域(见的shm_open(3),MMAP(2),和shmget的(2))。 (由于由叉创建子(2)继承父的存储器映射,它也可以访问信号量。),其可以访问共享存储器区域可使用sem_post信号量进行操作的任何方法(3),sem_wait(3),和等等。
你的信号是不是在共享内存,因此派生的子进程将不会在父进程(反之亦然)做任何更改。因此,这两个过程碰上了死锁。