使用O_RDWR与O_RDONLY | O_WRONLY

时间:2013-10-14 16:47:15

标签: c++ linux

在我的简单程序中:

#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,因为它使语义更清晰,但我的问题是,如果加入两个现有的标志已经有效,为什么还要创建一个完整的另一个标志呢?是否有一些历史原因,或者我只是忽略了什么,这实际上并没有起作用?

2 个答案:

答案 0 :(得分:27)

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

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

它的工作原理似乎是一个错误/特征/巧合,而不是“它的工作原因,因为它应该以这种方式工作”。

答案 1 :(得分:0)

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

<块引用>

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