1

ファイルへのアクセスを同期したい。Linux と g++ を使用しています。

関数を使用してファイルをロックしたいと思いますflock()。同じファイルへの書き込みと読み取りを行う 2 つのテスト アプリケーションを開発しました。flock()どちらもで呼び出しますLOCK_SH

ライターは最初に起動し、書き込み、次にスリープします。2 番目のアプリは後で起動します。flock()ライター プロセスがロックを解除しなかったため、呼び出し時にリーダー アプリがブロックされることを期待していました。

これは正しい期待ですか、それとも同時に呼び出された場合、つまり同時に呼び出された場合read()にのみブロックしますか? write()私は何を誤解しましたか?

    PROG A                PROG B
    -open file
    -flock                -open file
    -write                -sleep 5     
    -sleep 1000           -flock    ** expected to block ?? **
    -close                -read data
4

2 に答える 2

4

flock少なくとも1つのプロセスがそれを使用する場合にのみブロックされますLOCK_EX:

  • 一部のプロセスが排他ロックを保持している場合、排他/共有ロックを取得しようとするプロセスはブロックされます。
  • 一部のプロセスが共有ロックを保持している場合、排他ロックを取得しようとするプロセスはブロックされます。

一般に、読み取りには共有ロックを使用し、書き込みまたは読み取り/書き込みには排他的ロックを使用する必要があります。

于 2013-01-16T10:49:18.543 に答える
2

LOCK_SH共有ロックです。これは、そのようなロックを同時に保持している複数のプロセスに問題がないことを意味します。この種のロックはリーダーによって使用されます。

于 2013-01-16T10:46:51.043 に答える