命名 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 信号量的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 c 中使用 posix 命名信号量和 Linux 上两个进程之间的共享内存?