我使用POSIX信号量和共享内存来协调单个生产者和单个消费者缓冲区。我想完全初始化此共享内存和信号量,无论共享内存是否已命名或正在使用。这是我想要使用的功能:
/* shared data */
typedef struct {
sem_t sem;
size_t head;
size_t tail;
} shared_struct;
shared_struct * create_shmem_struct(const char *name) {
/* re-open shared memory */
shm_unlink(name);
int fd = shm_open (name, (O_CREAT | O_RDWR), (S_IRUSR | S_IWUSR));
ftruncate (fd, sizeof(shared_struct));
shared_struct *ptr = (shared_struct *) mmap (NULL, sizeof(shared_struct), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
/* initialize semaphore */
/* can i do this here? : sem_destroy(&ptr->sem); */
sem_init(&ptr->sem, 1, 1);
return ptr;
}
如果信号量已经初始化但在sem_destroy
之前没有调用shm_unlink
,信号量会发生什么变化?在sem_destroy
之前对可能未初始化的未命名信号量调用sem_init
是否有害?
我应该注意,我将此策略基于手册页found here中的Michael Kerrisk幻灯片。