繁体   English   中英

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

[英]synchronization between processes using unnamed semaphores

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

我已经编写了这样的代码,不管行不行?

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);

一般方法将起作用。 但是请注意以下几点:

  • shm_open(3)name参数应以斜杠开头。 改为传递"/shm_name" (在具有glibc的Linux上,它可以在没有斜线IIRC的情况下正常工作。)
  • 您需要使用ftruncate(2)调整fd大小,否则当您尝试访问共享内存时将获得SIGBUS 每当您mmap(2)一个文件时,您在映射中访问的任何内存实际上都必须存在于该文件中,并且POSIX共享内存对象的工作方式相同。 (在Linux上,它们被实现为/dev/shm下的文件,该文件使用内存中的tmpfs 。)
  • 如果您打算使用信号量来同步共享内存映射上的操作,那么为信号量创建单独的共享内存映射是多余的。 使其成为要对其进行同步操作的映射的一部分。

对于后者,您可以执行以下操作:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM