我想解决一个学校的问题,把POSIX信号传送过来。我遇到了一个问题,我已经将范围缩小到以下简化代码:
sem_t sem;
void parent() {
printf("waiting...\n");
sem_wait(&sem);
printf("done!\n");
}
void child() {
sem_post(&sem);
printf("go!\n");
exit(0);
}
int main() {
sem_init(&sem, 1, 0);
if(!fork())
child();
parent();
sem_destroy(&sem);
exit(0);
}当编译(使用gcc -Wall -pthread sems.c -o sems)并在Linux中运行这个程序时,我得到以下输出(程序没有完成执行):
waiting...
go!因为我在子进程中调用了sem_post(&sem),所以我希望父进程通过sem_wait(&sem),输出为:
waiting...
go!
done!更奇怪的是,出于好奇,我尝试用CLion (Cygwin编译器)在Windows上测试它,程序按预期工作。我在这里错过了什么?
发布于 2019-10-12 01:37:47
来自man page of sem_init()
如果pshared是非零的,那么信号量在进程之间是共享的,并且应该位于共享内存的区域(参见
(3)、mmap(2)和shmget(2))。(因为由fork(2)创建的子程序继承了父级的内存映射,所以它也可以访问信号量。)
。
您的sem变量没有在共享内存中分配;因此,尽管有一个非零的pshared参数,它不能在进程之间共享。每个进程都有自己独特的信号量实例。
https://stackoverflow.com/questions/58349350
复制相似问题