2009-04-22 14 views
5

私のプロセスの1つがファイルを開いた場合、読んでいるだけで、OSは私が読んでいるときに他のプロセスが書き込むことを保証しませんか? 古いファイルのバージョン、新しいファイルのバージョンの2番目の部分は、データの整合性が疑わしい?複数のプロセス上のファイル

私はシークのないパイプについては言及していませんが、通常のファイルではシークオプションを使用しています(少なくとも1つのプロセスでのみオープンされている場合)。

答えて

3

いいえ、他のプロセスがファイルの内容を変更することができます。 "man fcntl"を実行してを無視してください。の "advisory"ロックのセクションを無視してください。これらはオプションのロックであり、必要な場合にのみ注意を払う必要があります。代わりに、(悲しい、非POSIX) "必須"ロックを探します。 これらのは、他のプログラムからあなたを守るものです。読み取りロックを試みてください。

+0

必須のロックは、私の意見では望ましい機能ではありません:) – MarkR

+0

合意しました!優れたアプリケーション設計が望ましいでしょう。しかし、彼が制御できない読者に対してファイルを保護しなければならない場合、彼らは唯一の方法です。 –

2

いいえ、ファイルを開くと、ロックを使用しない限り、他のプロセスがファイルに書き込むことができます。

はLinuxでは、あなたがファイルに諮問ロックを追加することができます:あなたはそれを読んでいるよう

#include <sys/file.h> 

... 

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock 
+2

アドバイザリロックは、書き込みアプリケーションでも使用に同意しない限り、有用ではありません。 –

+0

関係するすべての当事者が注意を払っていることが保証されている場合は、アドバイザリロックで十分です。また、ロックが解除されるのを待つ間に1つのプロセスがブロックされると、デッドロックの可能性があることに注意してください。 – jiggy

+2

必須のロックが常に可能なわけではありません。たとえば、 "-o mand"でmountを実行し、ファイルのフラグを変更する必要があるかもしれません。 – Zifre

2

書き込みのためにファイルを開くことができるプロセスは、書き込み可能です。書き込みは自分自身の書き込みと同時に起こり、結果として(潜在的に)不確定な状態になる可能性があります。

悪いことが起こらないようにすることは、アプリケーション作家としての責任です。私の意見では、必須のロックは良い考えではありません。

もっと良いアイデアは、ファイルに書きたくないプロセスに書き込みアクセス権を与えることではありません。

複数のプロセスがファイルを開くと、独立したファイルポインタが存在するため、seek()と相互に影響しません。

ファイルがスレッドプログラム(またはより一般的にはファイル記述子を共有するタスク)によって開かれている場合は、ファイルポインタも共有されるため、競合を避けるために別の方法を使用する必要がありますカオスの原因となる条件 - 通常はpread、pwrite、またはscatter/gather関数readvとwritevです。

関連する問題