我正在尝试解决一个涉及 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);
}
在 Linux 中编译(使用 gcc -Wall -pthread sems.c -o sems
)和运行该程序时,我得到以下输出(程序未完成执行):
waiting...
go!
因为我在子进程中调用了 sem_post(&sem)
,所以我希望父进程通过 sem_wait(&sem)
并且输出为:
waiting...
go!
done!
更奇怪的是,出于好奇,我尝试使用 CLion(Cygwin 编译器)在 Windows 上对其进行测试,该程序按预期运行。我在这里缺少什么?
最佳答案
If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory (see shm_open(3), mmap(2), and shmget(2)). (Since a child created by fork(2) inherits its parent's memory mappings, it can also access the semaphore.)
您的sem
变量没有分配在共享内存中;因此,尽管 pshared
参数不为零,但它不能在进程之间共享。每个进程都有自己唯一的信号量实例。
关于linux - 奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58349350/