the related standard documentationを注意深く読んでも、O_CREAT|O_DIRECTORY
を含むopen
システムコールが呼び出されたときに、POSIX準拠のシステムで期待される動作がわかりません。open(name、O_CREAT | O_DIRECTORY、mode)の期待される動作は何ですか?
標準は、要求されたアクセスモードはどちらもO_WRONLYもO_RDWRで、結果は不定である
O_CREATとO_DIRECTORYが設定されている場合とことを指定します。
ただし、(O_CREAT|O_DIRECTORY|O_WRONLY)
と(O_CREAT|O_DIRECTORY|O_RDWR)
のどちらのシステムの動作も指定していません。確かに(私が理解できる限り)、EISDIR
の動作は、の既存のディレクトリにのみ適用されます。 O_CREATEに関連するセクションで
O_DIRECTORY がファイルは通常のファイルとして作成されなければならないが設定されていない場合。 [...]
が、再び、それはO_DIRECTORY
があまりにも設定されている場合は何が起こるかを指定しません。
NetBSD(POSIX準拠についてはよく知られています)とLinux(実際にはPOSIXではないにしても広く使われているシステムです)のマニュアルページを見てきましたが、何も分かりません。
両方のフラグの使用が指定されていないと言っても間違いありませんか? もしそうなら、最も一般的な行動は何ですか?
open(name, O_CREAT|O_DIRECTORY, mode)
は、POSIX準拠のOSでmkdir
に相当しますか?
オープンフラグ(または、おそらく 'O_EXEC'または' O_SEARCH')に 'O_RDONLY'、' O_WRONLY'、および 'O_RDWR'のいずれかを含める必要があることに注意してください。歴史的には、それらを省略すると 'O_RDONLY'(通常は0、' O_WRONLY'は通常1、 'O_RDWR'は通常2)を指定するのと同じですが、これらはビット値ではありません。 (POSIXで指定された 'O_EXEC'と' O_SEARCH'オプションは人生を複雑にしますが、Linux(Ubuntu 16.04 LTS)もmacOS 10.12.6もどちらもサポートしていません)。あなたの 'open()'コマンドは私が厳密にルールを遵守していなかったことを意識せずに。 –
POSIX仕様の['open()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html)の根拠節には、次のように書いてあります。さらに、 'open() '関数は、O_DIRECTORYフラグがセットされていれば非ディレクトリを開くことを拒否します。これにより、特権付きアプリケーションの実行中に機密ファイル(デバイスやFIFOなど)にハードリンクを置き換えることで、ユーザーがシステムを侵害する可能性のある競合状態が回避されます。読み取りアクセスの場合でもファイルを開くと、 ._ –