我正在努力学习如何使用信号量,我对它们的一般用法感到困惑。我试图理解我给出的一个例子。
这是第一个过程中信号量的初始化:
sem_t *s1 = sem_open(SEM_1, O_CREAT | O_EXCL, 0600, 1);
其中SEM_1是预定义名称。
我的问题始于O_CREAT | O_EXCL
部分。我知道你在创建信号量时设置了一个O_标志。 O_CREAT
应该创建一个信号量。 O_EXCL
如果已经创建,则应该使调用失败。我不确定的是这里是如何指定的。 sem_open的手册页说:
“如果在oflag中指定了O_CREAT和O_EXCL, 如果已经具有给定名称的信号量,则返回错误 存在“。
如果我理解正确,O_CREAT | O_EXCL
只是指定两个(按位或链接),对吗?那么O_EXCL的目的是什么呢?
继续,我知道0600是权限,1是信号量值。然后是下一个过程中的信号量:
sem_t *s1 = sem_open(SEM_1, 0);
在fcntl.h中查找0的定义显示
#define O_RDONLY 00000000
我假设在这里使用。但是,这不会打败信号量的目的,因为我最终需要增加/减少它的价值吗?
提前感谢您的帮助。
答案 0 :(得分:0)
如果我理解正确,
O_CREAT | O_EXCL
就是 指定两者(按位或链接),正确吗?
正确。
那么O_EXCL的目的是什么?
指定只是 O_EXCL
,i。即调用sem_open(SEM_1, O_EXCL)
,没有定义,没有意义。
然后是下一个过程中的信号量:
sem_t *s1 = sem_open(SEM_1, 0);
在fcntl.h中查找0的定义显示
#define O_RDONLY 00000000
我假设在这里使用。
你不应该做出毫无根据的假设。 oflag
参数的含义在sem_open
的手册中定义,完全如此。 O_CREAT
和O_EXCL
旁边没有其他标志 - 0
只表示没有给出任何标志。