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)
一般方法会起作用。但请注意以下事项:
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)