在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);发布于 2015-03-24 06:41:07
一般的办法会奏效。不过,请注意以下各点:
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);https://stackoverflow.com/questions/29225593
复制相似问题