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