如何理解 O_RDONLY = 0?

san*_*ica 4 c file-descriptor fcntl bitflags

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

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

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

产生这个输出

*** Flag O_RDONLY =     0
Run Code Online (Sandbox Code Playgroud)

这完全符合

#define O_RDONLY         00
Run Code Online (Sandbox Code Playgroud)

fcntl-linux.h.

如何将零值用作标志?

我希望“原子”标志是2^n( n>=1),而“复合”标志(如O_ACCMODE)只是几个原子标志的总和(这与按位或对这些原子标志进行按位或运算相同)。
据我了解,我无法“检测”任何东西,也无法设置此类标志。一个按位与运算的表达式 like(stat & O_RDONLY)总是错误的。

有关的:

如何获取文件描述符的模式?(我问过这个)

Bar*_*mar 5

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