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

标签 linux posix semaphore

我正在尝试解决一个涉及 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/

相关文章:

javascript - xmlHttpRequest 不关闭连接

c++ - ROS hydro + OpenNI2 + NiTE2 on Linux Ubuntu 12.04 NiTE 初始化失败

c - 是否可以对管道进行读而不是 block ,而是写 block ?

c - 一种在 c 中获取处理单元(# cpu,cores)nr 的可移植方法?

c - 将内存锁定到 C 中的物理 RAM 以用于动态分配指针

Python如何让两个不同的线程(A类,B类)共享一个串口

linux - 如果在 Linux 中找到特定行,如何替换 .csv 文件的某些单元格数

linux - SCP 命令不起作用 - 需要将文件从 Windows 本地主机复制到 Linux

java - 多线程:如何让一个线程比其他线程执行得更频繁?

java - 我可以让线程等待锁,然后在释放后跳过它吗?