如果在共享内存中初始化未命名的信号量,shm_unlink()是否会破坏信号量?

时间:2016-04-28 16:07:33

标签: c posix semaphore shared-memory

我使用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幻灯片。

0 个答案:

没有答案