Использование O_RDWR vs O_RDONLY | O_WRONLY

В моей простой программе:

#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, потому что он дает более четкое смысловое значение, но мой вопрос заключается в том, зачем беспокоиться о создании целого другого флага, если уже работает соединение двух существующих флагов? Есть ли какая-то историческая причина для этого, или я просто что-то пропускаю, и это действительно не работает?

Ответ 1

O_RDONLY | O_WRONLY (по крайней мере, на моей машине Linux) - это не то же самое, что O_RDWR.

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

Тот факт, что он работает, кажется ошибкой/особенностью/совпадением, а не "он работает, потому что он должен работать именно так".