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

时间:2015-03-24 05:25:57

标签: c posix ipc shared-memory semaphore

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

1 个答案:

答案 0 :(得分:4)

一般方法可行。但请注意以下几点:

  • name的{​​{1}}参数应以斜杠开头。改为通过shm_open(3)。 (在使用glibc的Linux上,它恰好没有斜线,IIRC。)
  • 您需要使用"/shm_name"调整fd的大小,或者在尝试访问共享内存时获得ftruncate(2)。无论何时SIGBUS文件,您在映射中访问的任何内存都必须存在于文件中,并且POSIX共享内存对象的工作方式相同。 (在Linux上,它们被实现为mmap(2)下的文件,它使用内存中的tmpfs。)
  • 如果您计划使用信号量来同步共享内存映射上的操作,那么为信号量创建单独的共享内存映射是多余的。将其作为您正在同步操作的映射的一部分。

对于后者,你可以做到,例如以下内容:

/dev/shm