系统调用 open() 中的标志组合如何工作?

PMH*_*PMH 2 c posix

fd = open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
Run Code Online (Sandbox Code Playgroud)

我的学费告诉我,这O_WRONLY | O_CREAT | O_TRUNC意味着系统调用允许写入and创建(如果有)and截断文件(如果有)。

但它不是|按位运算符 和 之一吗OR

系统如何解释该组合?我尝试用我学到的按位运算来解释这个组合,但我只是迷失了方向。有人可以解释一下吗?

R S*_*ahu 5

按位OR和标志有点不直观。

假设您有以下标志:

int FLAG_1 = 0x1; // in binary, 0001
int FLAG_2 = 0x2; // in binary, 0010
int FLAG_3 = 0x4; // in binary, 0100
Run Code Online (Sandbox Code Playgroud)

当您使用:

int flags = FLAG_1 | FLAG_3;
Run Code Online (Sandbox Code Playgroud)

flags二进制的值为0101。这意味着,已设置以下标志:FLAG_1AND FLAG_3

给定 的值flags,您可以FLAG_3使用 bitwise 检查是否已设置AND

if ( flags & FLAG_3 != 0 )
{
   // FLAG_3 has been set.
}
Run Code Online (Sandbox Code Playgroud)

当您将标志组合为 时,会使用相同的逻辑O_WRONLY | O_CREAT | O_TRUNC

有关位掩码的更多信息可以在http://en.wikipedia.org/wiki/Mask_(computing)找到。