gpt4 book ai didi

linux - 奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:14 24 4
gpt4 key购买 nike

我正在尝试解决一个涉及 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 上对其进行测试,该程序按预期运行。我在这里缺少什么?

最佳答案

来自man page of sem_init() :

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com