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

nan*_*ala 2 c posix semaphore ipc shared-memory

我正在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);
Run Code Online (Sandbox Code Playgroud)

Ulf*_*zer 6

一般方法会起作用。但请注意以下事项:

  • name的参数应该shm_open(3)以斜线开头。改为"/shm_name"通过。(在使用 glibc 的 Linux 上,它恰好可以在没有斜线的情况下工作,IIRC。)
  • 您需要使用 调整fd大小,否则当您尝试访问共享内存时ftruncate(2)会得到。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);
Run Code Online (Sandbox Code Playgroud)