C:sem_open oflags

时间:2015-12-27 17:08:00

标签: c header-files semaphore

我正在努力学习如何使用信号量,我对它们的一般用法感到困惑。我试图理解我给出的一个例子。

这是第一个过程中信号量的初始化:

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

我假设在这里使用。但是,这不会打败信号量的目的,因为我最终需要增加/减少它的价值吗?

提前感谢您的帮助。

1 个答案:

答案 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_CREATO_EXCL旁边没有其他标志 - 0只表示没有给出任何标志。