4

このファイルを作成しようとする別のプロセスが失敗するように、ファイルが存在しない場合は作成する必要があります。作成プロセスが実際のデータの書き込みを完了する前であっても、ファイルを「作成済み」と見なす必要があります。

O_EXCLflag toについて読んだopen()ので、解決策が存在するようですが、いくつか質問があります。

  1. この技術の経験はありますか?それはどれほど良いですか?(DBレベルの原子性を持つことはできないと思いますが、十分です... まあ、十分です)
  2. ファイルが作成されたと見なされるように、すぐにファイルを閉じてopen()から、書き込み用に再度開く必要がありますか?
  3. 注意すべき微妙な点はありますか?
4

2 に答える 2

7

open()のman ページには、NFS でメソッドが失敗する可能性があると書かれています。

O_EXCL のセクションから:

O_CREAT と共に使用すると、ファイルが既に存在する場合はエラーになり、open() は失敗します。このコンテキストでは、シンボリック リンクがどこを指しているかに関係なく存在します。O_EXCL は NFS ファイル システムでは機能しません。ロックタスクを実行するためにそれに依存するプログラムには、競合状態が含まれます。

そして、より一般的な解決策を提案します:

lockfile を使用してアトミック ファイル ロックを実行するための解決策は、同じファイル システム上に一意のファイルを作成し (たとえば、ホスト名と pid を組み込む)、link(2) を使用してロックファイルへのリンクを作成することです。link() が 0 を返す場合、ロックは成功です。それ以外の場合は、一意のファイルで stat(2) を使用して、リンク数が 2 に増加したかどうかを確認します。この場合、ロックも成功しています。

さまざまな問題とアプローチの詳細については、この Web ページの「ファイルをロックとして使用する」セクションを参照してください。

于 2011-03-06T14:12:19.067 に答える
1

POSIX言います:

O_CREAT と O_EXCL が設定されている場合、ファイルが存在すると open() は失敗します。ファイルが存在するかどうかのチェックと、存在しない場合のファイルの作成は、O_EXCL と O_CREAT が設定された同じディレクトリで同じファイル名を指定して open() を実行する他のスレッドに関してアトミックである必要があります。

そのため、使用している他のプロセスO_EXCLは、作成されるとすぐに開いたと見なします。

于 2011-03-06T14:53:31.130 に答える