命名 POSIX 信号量的问题

Posted

技术标签:

【中文标题】命名 POSIX 信号量的问题【英文标题】:Issues with named POSIX semaphore 【发布时间】:2016-02-24 06:57:06 【问题描述】:

我正在尝试使用 POSIX 命名信号量来确保我的可执行文件只有一个实例可以运行。但是我遇到了麻烦;信号量的值总是 0,所以它总是阻塞。

#include <semaphore.h>  /* required for semaphores */
#include <stdio.h>
#include <unistd.h>     /* usleep */
#include <fcntl.h>      // O_EXCL
#include <assert.h>
#include <stdlib.h>     /* exit, EXIT_FAILURE */


int main(int argc, char *argv[])

  int ret;
  int i;
  sem_t* semaphore;

  semaphore = sem_open("/mysemaphore", O_EXCL, 0777 /*0644*/, 2);
  printf("sem_open returned %p at line %u\n", semaphore, __LINE__);

  // if it exists, open with "open", and parameters will be ignored (therefore given as 0)
  if(!semaphore)
  
    semaphore = sem_open("/mysemaphore", O_CREAT, 0, 0);
    printf("sem_open returned %p at line %u\n", semaphore, __LINE__);
  

  // either of the above calls should have given us a valid semaphore
  assert(semaphore);

  // read its value time and again
  ret = sem_getvalue(semaphore, &i);
  printf("sem_getvalue returned %i at line %u, value is %i\n", ret, __LINE__, i);

// ....

输出:

sem_open returned 0x8003a4e0 at line 36
sem_getvalue returned 0 at line 50, value is 0

平台:Cygwin 1.7.33-2

使用此命令构建:

gcc Main.c -o Main -lpthread

非常感谢您的帮助!

【问题讨论】:

信号量开始时的值为 0。您的信号量上是否有任何实际递增(调用 sem_post())的代码? 【参考方案1】:

使用sem_post(semaphore) 增加,sem_wait(semaphore) 减少。

另外,当使用 O_CREAT 时,模式和值应该被指定为有用的东西:

semaphore = sem_open("/mysemaphore", O_CREAT, 0777, 0);

【讨论】:

非常感谢您回复我的请求。但是,我不明白“应该将模式和值指定为有用的东西”是什么意思:我将值设置为 1 或 2,因为这是我想要的,但它似乎没有效果。 “值”和“模式”的正确值是多少?如果值还是 0,那么设置值的目的是什么? 关于上述,根据 sem_open() 规范,“如果指定了 O_CREAT,并且具有给定名称的信号量已经存在,则忽略模式和值。” (我从link复制了这个声明) 我可以确认使用 sem_post() 我可以增加信号量的值。它没有回答上面的问题,但它让我前进了一点。我现在可以看到的是,当我在程序末尾执行以下操作时: 'code'(sem_close(semaphore); sem_unlink("/mysemaphore");) 并再次运行程序,信号量仍然存在,即出乎意料。

以上是关于命名 POSIX 信号量的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 内核命名空间之间使用 POSIX 信号量

POSIX 信号量

如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?

是否可以仅使用 POSIX 信号量来避免唤醒等待竞赛?是良性的吗?

用于IPC的命名信号的POSIX实现

Linux系统编程POSIX有名信号量