`fcntl` と `flock` によるロックの違いは何ですか? 質問する

`fcntl` と `flock` によるロックの違いは何ですか? 質問する

何時間も読んでいるが、何が言いたいのか分からない違いfcntl()2 つのロックの違い。私が理解しているのは、ロックは特定のバイトをロックでき、fcntl()NFS ロックのみをサポートする粒度の高いロックを提供しているということだけです。

違いはセマンティクスにあり、dup()または whileによって複製されたときにどのように動作するかということだと言われていますfork()が、実際の違いが何なのか理解できません。

私のシナリオは、ベースサーバーのログファイルに書き込んでいるのですがfork()、フォークされたプロセスはすべて同じファイルに書き込んでいます。何か発生します。なぜロックflock()を使用する必要があるのでしょうか?fcntl()

ベストアンサー1

私は入手可能なドキュメントに基づいて違いを理解しようとし、次のような結論に達しました (間違っていたら訂正してください)。

fcntl() (POSIX) の場合:

  • プロセス ID を含むファイルシステム レベルでファイルのロック レコードを作成します。

  • プロセスが終了するか、このファイルへのファイル記述子が閉じられると、ロック レコードはシステムによって削除されます。

  • ファイル記述子が書き込みアクセスで開かれていない場合、排他ロックの要求は失敗します。

  • 簡単に言うと、fnctlロックはプロセス <--> ファイル関係、ファイル記述子を無視

flock() (BSD) は異なります (Linux: カーネル 2.0 以降、flock() は fcntl の呼び出しとして GNU C ライブラリでエミュレートされるのではなく、独自のシステム コールとして実装されています):

  • flock() は、システムの「オープン ファイルの説明」にロックを作成します。「オープン ファイルの説明」は、open() 呼び出しによって生成されます。

  • ファイル記述子(FD)は「オープンファイル記述」への参照です。FDは重複()またはフォーク()同じ「ファイルを開く説明」を参照してください。

  • プロセスは、ファイルを複数回開くことによって、1 つのファイルに対して複数の「オープンファイルの説明」を生成する場合があります。

  • flock() は、FD を介して「オープンファイル記述」にロックを配置します。

  • したがって、flock() は、プロセス間およびスレッド間 (1 つ以上のプロセス内) のファイル アクセスを同期するために使用できます。

  • 見る群れ(2)そして特に開く(2)「オープンファイルの説明」の詳細については、man ページを参照してください。

あなたのシナリオでは、おそらく fcntl() ベースのロックを使用する必要があるでしょう。これは、フォークされたプロセスが独自にログファイルを open() し、ロックが配置されている可能性のあるファイル記述子を継承することを想定していないためです。

複数のスレッド間で同期が必要な場合、おそらく複数のプロセスで、システムが fcntl() によるエミュレーションなしで flock() ベースのロックをサポートしている場合は、それを使用する必要があります。その後、各スレッドは、dup() または fork() されたハンドルを使用するのではなく、ファイルを open() する必要があります。

2022年編集: ここに素晴らしい記事と追加の考えがあります:https://lwn.net/Articles/586904/

おすすめ記事