【问题标题】:How to make sense of O_RDONLY = 0?如何理解 O_RDONLY = 0?
【发布时间】:2020-09-07 10:41:33
【问题描述】:

我正在处理文件状态标志。 在我进行的测试中,我发现

#include <stdio.h>
#include "fcntl.h"

int main() {
    const int flag = O_RDONLY;
    printf( "*** Flag O_RDONLY = %5d\n", flag);
    return 0;
}

产生这个输出

*** Flag O_RDONLY =     0

完全符合

#define O_RDONLY         00

来自fcntl-linux.h。

如何将零值用作标志?

我希望“原子”标志是 2^n (n&gt;=1),而“复合”标志(如 O_ACCMODE)只是几个原子标志的总和(与按位或相同) 'ing 那些原子标志)。
据我了解,我无法“检测”任何东西,也无法设置这样的标志。 像(stat &amp; O_RDONLY) 这样的按位与表达式将始终为假。

相关:

How to get the mode of a file descriptor?(我问过这个)

【问题讨论】:

  • 如果您对文件无能为力,那剩下的呢?
  • 文件状态标志不是位掩码。它们只是 3 个替代选项:O_RDONLY = 0、O_WRONLY = 1、O_RDWR = 2
  • o_flags 的值是使用按位或运算构造的
  • @AndreasDM 不,他们不是。 O_RDONLY | O_WRONLY != O_RDWR
  • True: _O_RDONLY 打开一个只读文件。不能用_O_RDWR 或_O_WRONLY 指定。

标签: c file-descriptor fcntl bitflags


【解决方案1】:

虽然这些在文档中被称为标志,但这三个实际上并不是可以像其他标志那样组合的原子标志。它们是O_ACCMODE 位的互斥替代值。你不使用stat &amp; RDONLY 来测试它,你使用(stat &amp; O_ACCMODE) == O_RDONLY。

【讨论】:

  • 太棒了!实际上,手册页man7.org/linux/man-pages/man2/open.2.html首先描述了文件访问模式,然后添加了“此外,零个或多个文件创建标志和文件状态标志可以在标志中按位或...”但它没有提到文件访问模式可以按位操作。对我来说,“旗帜”这个词绝对是用词不当,而且具有误导性。
  • 相关,能否请您查看stackoverflow.com/questions/61909358/…并提供您的见解?
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2017-05-02
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多