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

Strange POSIX semaphore behavior (stuck on sem_wait on Linux)

我正在尝试解决涉及 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 参数非零,但它不能在进程之间共享。每个进程都有自己唯一的信号量实例。