Trotz sorgfältiger Lese von the related standard documentation kann ich nicht verstehen, was das erwartete Verhalten in POSIX-konformen Systemen ist, wenn ein open
-Systemaufruf mit Flags einschließlich O_CREAT|O_DIRECTORY
aufgerufen wird.Was ist das erwartete Verhalten von open (Name, O_CREAT | O_DIRECTORY, Modus)?
Der Standard legt fest, dass
Wenn O_CREAT und O_DIRECTORY gesetzt und der angeforderten Zugriffsmodus weder O_WRONLY ist noch O_RDWR, das Ergebnis ist nicht spezifiziert.
Es gibt jedoch weder das Verhalten des Systems mit (O_CREAT|O_DIRECTORY|O_WRONLY)
noch (O_CREAT|O_DIRECTORY|O_RDWR)
. In der Tat (soweit ich das verstehen kann) gilt das Verhalten auf EISDIR
nur für bestehende Verzeichnisse.
Im Abschnitt zu O_CREATE Zusammenhang gibt die Norm, dass, wenn die angegebene Datei nicht existiert,
wenn O_DIRECTORY nicht die Datei als reguläre Datei erstellt wird gesetzt wird; [...]
aber es wird auch nicht angegeben, was passieren wird, wenn O_DIRECTORY
auch gesetzt ist.
Ich habe die Handbücher der beiden NetBSD (die sich notorisch viel um POSIX-Compliance kümmert) und Linux (das ist ein weit verbreitetes System, obwohl nicht eigentlich ein POSIX), aber ich kann keine Klarstellung finden.
Ist es richtig zu sagen, dass die Verwendung beider Flags nicht spezifiziert ist? Und wenn ja, was ist das häufigste Verhalten?
Ist open(name, O_CREAT|O_DIRECTORY, mode)
äquivalent zu mkdir
auf einem POSIX-kompatiblen Betriebssystem?
Beachten Sie, dass Sie eine der 'O_RDONLY',' O_WRONLY' und 'O_RDWR' in die offenen Flags (oder möglicherweise' O_EXEC' oder 'O_SEARCH') aufnehmen sollten. Historisch gesehen ist das Auslassen von diesen gleichbedeutend mit der Angabe von 'O_RDONLY' (es ist normalerweise 0;' O_WRONLY' ist normalerweise 1, und 'O_RDWR' ist normalerweise 2), aber dies sind keine Bitwerte. (Die von POSIX angegebenen 'O_EXEC'- und' O_SEARCH'-Optionen erschweren das Leben, aber weder Linux (Ubuntu 16.04 LTS) noch Mac OS 10.12.6 unterstützt beide.) Ich sehe jetzt, wo ich meinen "fehlerhaften" Code herbekomme - ich kopiere Ihr 'open()' Befehl ohne zu merken, dass ich mich nicht streng an die Regeln hielt. –
Im Begründungsteil der POSIX-Spezifikation für ['open()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) steht: _Darüber hinaus ist das 'open() 'Funktion weigert sich, Nicht-Verzeichnisse zu öffnen, wenn das O_DIRECTORY-Flag gesetzt ist. Dies vermeidet Race-Bedingungen, wodurch ein Benutzer das System kompromittieren könnte, indem er eine harte Verbindung zu einer empfindlichen Datei (z. B. einem Gerät oder einem FIFO) während der Ausführung einer privilegierten Anwendung austauscht, wobei das Öffnen einer Datei selbst für den Lesezugriff unerwünschte Nebenwirkungen haben könnte ._ –