首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用未命名信号量的进程之间的同步

使用未命名信号量的进程之间的同步
EN

Stack Overflow用户
提问于 2015-03-24 05:25:57
回答 1查看 2.2K关注 0票数 2

process-1中,我试图将数据写入共享内存。同时,在process-2中,我从同一个共享内存读取数据。在这种情况下,我需要在这两个进程之间提供同步。如果我将使用未命名的信号量(使用shm_init(),mmap()),它是否有效?

我已经写过这样的代码了,它能工作吗?

代码语言:javascript
复制
fd = shm_open("shm_name", O_CREAT| O_RDWR, S_IRUSR | S_IWUSR);

sema = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE,MAP_SHARED , fd, 0);

sem_init(sema, 1, 1);
EN

回答 1

Stack Overflow用户

发布于 2015-03-24 06:41:07

一般的办法会奏效。不过,请注意以下各点:

  • nameshm_open(3)的参数应该以斜杠开头。用"/shm_name"代替。(在带有glibc的Linux上,它碰巧没有斜杠IIRC。)
  • 您需要使用一个fd来调整ftruncate(2)的大小,否则当您试图访问共享内存时,您将得到一个SIGBUS。每当您使用mmap(2)文件时,您在映射中访问的任何内存都必须实际存在于文件中,而POSIX共享内存对象的工作方式也是相同的。(在Linux上,它们是在/dev/shm下实现的,它使用内存中的tmpfs。)
  • 如果计划使用信号量来同步共享内存映射上的操作,那么只为信号量创建单独的共享内存映射是多余的。让它成为您正在同步操作的映射的一部分。

对于后者,你可以这样做,例如:

代码语言:javascript
复制
typedef struct Shared_mem {
    sem_t sem;
    int shared_data[100];
} Shared_mem;

...

shared_mem = mmap(NULL, sizeof(Shared_mem), PROT_READ | PROT_WRITE,
                  MAP_SHARED, fd, 0);

...

sem_init(&shared_mem->sem, 1, 1);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29225593

复制
相关文章

相似问题

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