UN*X 準拠 (OpenGroup により認定された POSIX / IEEE 1003.1) システムの場合、これを義務付けるOpenGroups 仕様として動作が保証されます。見積もり:open(2)
O_EXCL
O_CREAT と O_EXCL が設定されている場合、ファイルが存在する場合、open() は失敗します。ファイルが存在するかどうかのチェックと、存在しない場合のファイルの作成は、O_EXCL と O_CREAT が設定された同じディレクトリで同じファイル名を指定して open() を実行する他のスレッドに関してアトミックである必要があります。O_EXCL と O_CREAT が設定され、パス名がシンボリック リンクの場合、シンボリック リンクの内容に関係なく、open() は失敗し、errno を [EEXIST] に設定します。O_EXCL が設定され、O_CREAT が設定されていない場合、結果は未定義です。
「一般的な」UN*X および UN*X に似たシステム (Linux、MacOSX、*BSD、Solaris、AIX、HP/UX) は、確かにそのように動作します。
Windows API にはopen()
そのようなものがないため、そこにあるライブラリ関数は必然的にネイティブ API に関して再実装されますが、セマンティクスを維持することは可能です。
広く使用されているどのシステムが準拠していないかはわかりません。QNX は POSIX 認定ではありませんが、ドキュメントに同じステートメントがありopen()
ます。*BSD のマンページでは「原子性」について明示的に言及されていませんが、Free/Net/OpenBSD はそれを実装しています。SymbianOS (Windows のように UN*X っぽいopen
システム コールがない) のようなエキゾチックなものでさえ、アトミックなオープン/作成を行うことができます。
open()
より興味深い結果を得るには、上記のセマンティクスを実装しているが実装していないオペレーティングシステム/ Cランタイムライブラリを見つけてみてください...そしてPythonがスレッドで実行されます(MSDOS ...)。
編集:open
私の投稿は、特に「この特徴を持つオペレーティング システムは?」に焦点を当てています。- 答えは、「ほぼすべて」です。に関して。ただし、ネットワークファイルシステムはNFS、SMB / CIFSなどであるかどうかにかかわらず、サービス拒否が発生する可能性があるため、常に維持されるとは限らないため、状況は異なります(クライアントがファイルサーバーとの通信を停止した場合)/がシャットダウンされると、他のすべての人がロックアウトされます)。O_EXCL
open(..., O_EXCL, ...)