18

在我的简单程序中:

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sstream>

using namespace std;

int main(int argc, char *argv[]) {
    stringstream ss;
    ss << "What does the quick brown fox say?" << endl;

    int file_descriptor = open("/dev/tty", O_RDONLY | O_WRONLY);
    write(file_descriptor, ss.str().c_str(), ss.str().size());
}

我使用组合打开终端流O_RDONLY| O_WRONLY,这似乎工作正常。我知道你应该使用O_RDWR它,因为它具有更清晰的语义意义,但我的问题是,如果加入两个现有标志已经有效,为什么还要创建一个完整的另一个标志?这是否有一些历史原因,或者我只是忽略了一些东西,而这真的不起作用?

4

2 回答 2

39

O_RDONLY | O_WRONLY(至少在我的 Linux 机器上)与O_RDWR.

#define O_RDONLY         00
#define O_WRONLY         01
#define O_RDWR           02

它起作用的事实似乎是一个错误/功能/巧合,而不是“它之所以起作用,是因为它应该以这种方式起作用”。

于 2013-10-14T16:53:51.613 回答
1

来自 open(2) 的 Linux 手册页:

与可以在标志中指定的其他值不同,访问模式值 O_RDONLY、O_WRONLY 和 O_RDWR 不指定单独的位。相反,它们定义了标志的低位两位,分别定义为 0、1 和 2。 换句话说,组合 O_RDONLY | O_WRONLY 是一个逻辑错误,当然与 O_RDWR 的含义不同。

于 2021-07-27T12:58:49.477 回答