gpt4 book ai didi

C: sem_open oflags

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:12 25 4
gpt4 key购买 nike

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

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

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

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

在此先感谢您的帮助。

最佳答案

If I understand correctly, O_CREAT | O_EXCL is just specifying both (bit-wise OR linking), correct?

正确。

What's the purpose of just O_EXCL, then?

指定 just O_EXCL,即。 e.调用 sem_open(SEM_1, O_EXCL),未定义且无意义。

Then there's the semaphore in the next process:

sem_t *s1 = sem_open(SEM_1, 0); 

Looking up the definition for 0 in fcntl.h reveals

#define O_RDONLY    00000000 

Which I assume is used here.

您不应该做出毫无根据的假设。 oflag 参数的含义在sem_open 的手册中定义,并且完整。除了 O_CREATO_EXCL 之外没有其他标志 - 0 只是意味着没有给出这些标志。

关于C: sem_open oflags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com