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が、私の質問は、2 つの既存のフラグを結合することが既に機能している場合に、なぜわざわざ別のフラグを作成するのかということです。これには何らかの歴史的な理由がありますか、それとも私が何かを見落としているだけで、これは実際には機能しませんか?

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 に答える