在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);
答案 0 :(得分:4)
一般方法可行。但请注意以下几点:
name
的{{1}}参数应以斜杠开头。改为通过shm_open(3)
。 (在使用glibc的Linux上,它恰好没有斜线,IIRC。)"/shm_name"
调整fd
的大小,或者在尝试访问共享内存时获得ftruncate(2)
。无论何时SIGBUS
文件,您在映射中访问的任何内存都必须存在于文件中,并且POSIX共享内存对象的工作方式相同。 (在Linux上,它们被实现为mmap(2)
下的文件,它使用内存中的tmpfs。)对于后者,你可以做到,例如以下内容:
/dev/shm