打开一个信号量返回 0

Posted

技术标签:

【中文标题】打开一个信号量返回 0【英文标题】:Opening a semaphore return 0 【发布时间】:2020-10-17 12:18:36 【问题描述】:
char* cath="/cath";
char* cathFlag="/cathf";
char* hyp="/hyp";
char* hypFlag="/hypf";

printf("SEMS OPEN\n");
sem_t *csem = sem_open(cath, O_CREAT, 0777, 0);
printf("CSEM: %d\n", *csem);
perror("ERROR: ");
sem_t *cfsem = sem_open(cathFlag, O_CREAT, 0777, 0);
sem_t *hsem = sem_open(hyp, O_CREAT, 0777, 0);
sem_t *hfsem = sem_open(hypFlag, O_CREAT, 0777, 0); 
printf("SEMS OPENED\n");

sem_open 返回 0,perror 写入成功,信号量未打开。浏览了sem_overview,我发现问题可能出在名称开头没有斜线,添加没有帮助。当sem_post 被称为带有分段错误的shell 中止进程时,无法访问信号量。帮助我了解问题所在。 编辑:如果我重新启动系统(并清理信号量?),perror 返回“没有这样的文件或目录”,但在返回“成功”之后。

【问题讨论】:

perror() 应该在 printf() 之前。 [并且:诊断输出应该到 stderr,而不是 stdout] 另外:你不应该在这里取消引用 csem:printf("CSEM: %d\n", *csem); 在创建后与ipcs -aipcs -s 核对,然后再进行任何其他操作 @sravs "Semaphore Arrays" 表在我运行程序之前和之后都是空的。 @sravs:“ipcs”不适用于 Posix 信号量,而是已弃用的 System V 信号量(semget()、semctl()...)。请查看 /dev/shm。 此外,您不能将 sem_t 打印为 int。这不会给你任何连贯的结果。我试过你的程序抑制 printf 并且它有效。看看 /dev/shm ! 【参考方案1】:

这是我尝试过的方法:

#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <semaphore.h>
#include <stdio.h>


int main(void)


char* cath="/cath";
char* cathFlag="/cathf";
char* hyp="/hyp";
char* hypFlag="/hypf";

printf("SEMS OPEN\n");
sem_t *csem = sem_open(cath, O_CREAT, 0777, 0);
//perror("ERROR: ");
sem_t *cfsem = sem_open(cathFlag, O_CREAT, 0777, 0);
sem_t *hsem = sem_open(hyp, O_CREAT, 0777, 0);
sem_t *hfsem = sem_open(hypFlag, O_CREAT, 0777, 0); 
printf("SEMS OPENED\n");


我编译了它:

$ gcc tsem.c -l pthread

我运行它:

$ ./a.out
SEMS OPEN
SEMS OPENED

我查看了/dev/shm:

$ ls /dev/shm
sem.cath  sem.cathf  sem.hyp  sem.hypf

【讨论】:

以上是关于打开一个信号量返回 0的主要内容,如果未能解决你的问题,请参考以下文章

信号集

Linux信号量

C: MAC OS X 中的信号量意外 sem_close 错误

[国嵌攻略][083][信号互斥编程]

linux系统上信号发送和信号接收讲解

二十Linux 进程与信号---非局部跳转