【问题标题】:C: sem_open oflagsC: sem_open 标记
【发布时间】:2015-12-27 17:08:00
【问题描述】:

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

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

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

我假设在这里使用。不过,这不会有点违背信号量的目的吗,因为我最终需要增加/减少它的值?

提前感谢您的帮助。

【问题讨论】:

    标签: c header-files semaphore


    【解决方案1】:

    如果我理解正确,O_CREAT | O_EXCL 只是 指定两者(按位或链接),对吗?

    正确。

    那么 O_EXCL 的目的是什么?

    指定只是O_EXCL,即。 e.调用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 只是意味着没有给出这些标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多