首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么sem_open要在没有共享内存的情况下使用叉子()?

为什么sem_open要在没有共享内存的情况下使用叉子()?
EN

Stack Overflow用户
提问于 2014-01-15 05:36:52
回答 1查看 2K关注 0票数 4

这个程序可以工作(我测试了它),尽管信号量不在共享内存中。请注意,我是如何创建变量一次的--在fork()之前。

另一方面,使用sem_init()创建的信号量需要在共享内存中才能工作。但是它仍然是一个sem_t结构,那么为什么它不需要共享内存呢?

sem_t结构的内容有什么不同吗?

代码语言:javascript
运行
复制
sem_t *s = sem_open("mysemaphore1", O_CREAT, 0600, 0);
if (fork()) {
    sleep(3);
    sem_post(s);
} else {
    sem_wait(s);
    printf("Woke\n");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-15 05:48:05

sem_open()创建的信号量是一个命名的信号量。命名信号量的基本用途是在不相关的进程之间使用。sem_init()创建的信号量是一个未命名的信号量。它比命名的信号量轻,需要在相关进程之间使用共享内存。如果在同一进程的线程之间使用,则可以将其保存在全局变量中。

sem_open()返回的指针实际上是指向设置了MAP_SHARED标志的mmap()映射的内存的指针。由于这种类型的内存在整个fork()中持续存在,因此您可以在父级和子级中使用相同的变量来访问命名的信号量。

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

https://stackoverflow.com/questions/21129845

复制
相关文章

相似问题

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