如何将未命名的Posix信号量写入共享内存?

问题描述 投票:1回答:1

我想向共享内存写一个信号灯。我的第一个想法是将mmap返回的指针传递给sem_init()

#include <stdio.h>
#include <semaphore.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    sem_t *sem_ptr;
    int shm_fd = shm_open("Shm", O_CREAT | O_RDWR, DEFFILEMODE);
    fprintf(stderr, "%s\n", strerror(errno));
    sem_ptr = mmap(NULL, sizeof(sem_t), PROT_WRITE, MAP_SHARED, shm_fd, 0);
    fprintf(stderr, "%p\n", strerror(errno));
    sem_init(sem_ptr, 1, 1);
    fprintf(stderr, "%s\n", strerror(errno));

    sem_destroy(sem_ptr);
    return 0;
}

但会导致此错误(当调用sem_init()时:Process finished with exit code 135 (interrupted by signal 7: SIGEMT

然后我尝试使用sem_t变量初始化信号量并将其写入共享内存:

int main(void)
{
    sem_t *sem_ptr;
    sem_t s;
    int shm_fd = shm_open("Shm", O_CREAT | O_RDWR, DEFFILEMODE);
    fprintf(stderr, "%s\n", strerror(errno));
    sem_ptr = mmap(NULL, sizeof(sem_t), PROT_WRITE, MAP_SHARED, shm_fd, 0);
    fprintf(stderr, "%p\n", strerror(errno));
    sem_init(&s, 1, 1);
    fprintf(stderr, "%s\n", strerror(errno));

    *sem_ptr = s;

    sem_destroy(&s);
    return 0;
}

现在,行*sem_ptr = s;导致与第一个程序相同的错误

谁能帮我吗?

c unix posix semaphore shared-memory
1个回答
0
投票

您创建信号量的第一个策略是正确的。您不必将sem_t对象复制到其他内存地址并使其仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.