首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的POSIX信号量行为(粘在Linux上的sem_wait上)

奇怪的POSIX信号量行为(粘在Linux上的sem_wait上)
EN

Stack Overflow用户
提问于 2019-10-11 22:58:35
回答 1查看 867关注 0票数 1

我想解决一个学校的问题,把POSIX信号传送过来。我遇到了一个问题,我已经将范围缩小到以下简化代码:

代码语言:javascript
运行
复制
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中运行这个程序时,我得到以下输出(程序没有完成执行):

代码语言:javascript
运行
复制
waiting... 
go!

因为我在子进程中调用了sem_post(&sem),所以我希望父进程通过sem_wait(&sem),输出为:

代码语言:javascript
运行
复制
waiting...
go!
done!

更奇怪的是,出于好奇,我尝试用CLion (Cygwin编译器)在Windows上测试它,程序按预期工作。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-12 01:37:47

来自man page of sem_init()

如果pshared是非零的,那么信号量在进程之间是共享的,并且应该位于共享内存的区域(参见

(3)、mmap(2)和shmget(2))。(因为由fork(2)创建的子程序继承了父级的内存映射,所以它也可以访问信号量。)

您的sem变量没有在共享内存中分配;因此,尽管有一个非零的pshared参数,它不能在进程之间共享。每个进程都有自己独特的信号量实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58349350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档