如何理解 O_RDONLY = 0?

How to make sense of O_RDONLY = 0?

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

#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.

零值如何作为标志?

我希望 "atomic" 标志是 2^nn>=1),而 "composite" 标志(如 O_ACCMODE)只是几个原子标志(与按位或那些原子标志相同)。
据我所知,我不能 "detect" 任何东西,而且永远不能设置这样的标志。 像 (stat & O_RDONLY) 这样的按位与表达式将始终为假。

相关:

(我问这个)

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