【问题标题】:how to initiliaze unnamed semaphore with shared memory?如何使用共享内存初始化未命名的信号量?
【发布时间】:2020-08-21 15:40:40
【问题描述】:

我知道未命名的信号量应该在共享内存区域,但我不知道如何实现,因为 mmap() 返回一个指向映射区域的指针,我有义务使用 sem_t 指针,但这一次,我认为这并不安全。这是我所做的,

    sem_t *sem;
    char* name = "sharedSem";
    int fd;

    sem_init(sem, 1, 1);

    fd = shm_open(name, O_CREAT | O_RDWR, 0666);
    if(fd == -1)
    {
        perror("fail");
        exit(-1);
    }
    ftruncate(fd, sizeof(sem_t));
    sem = (sem_t*) mmap(0, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

当我使用指针时,我也无法读取信号量的值,我什至不知道是否可以..

我可以在共享内存区域中创建一个没有 sem_t 指针的未命名信号量,子进程也可以访问吗?

【问题讨论】:

  • 我现在加的,是linux的。

标签: c linux fork semaphore shared-memory


【解决方案1】:

问题是您正在调用sem_initsem 仍然没有特别指向任何地方。将该调用移至mmap 的结果之后(即,移至您发布的 sn-p 的底部)。

【讨论】:

  • 要在另一个进程(如子进程)中使用未命名的信号量,我是否必须再次打开,或者我可以在子进程中使用信号量的名称吗?
  • @Wokers 对于子进程,您也可以在其中使用相同的sem 变量,无需任何额外步骤。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2020-09-01
  • 2014-01-09
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多