2011-12-16 6 views
0

私はfopen(filename、 "w")を呼び出すプロセスコールAを持っているとします。プロセスBはfopen(filename、 "r")を0.2秒ごとに呼び出し、そこからデータを読み込みます。2つのプロセスが同時に1つの "W"、もう1つの "r"を呼び出します。エラーが発生しますか?

Aがデータを書き込んでいる間に、Aプロセスを終了する前に、Bプロセスがそのデータを読み込んで読み込みます。私はそれが同期の問題があると思う!

ミューテックスの使用はスレッドで簡単ですが、プロセス間でミューテックスを試していません。データはたかだか400バイトしかないので、データを書き込むプロセスを回避する簡単な方法と、同時に読む別のプロセス、または1つのプロセスがファイルを開いている間に別のプロセスBがプロセスAがファイルを閉じるまで待ちます。

+0

待機...毎回同じファイルですか、別のファイルですか? – fge

+2

ファイルが2つのプロセスが互いに話すための手段としてのみ使用されている場合は、おそらく異なるプロセス間通信(パイプやソケットなど)を考慮する必要があります – NPE

+0

ありがとう、常に同じファイルです...両方のプロセスで、実際にはプロセスAをソケットサーバーにしていて、ソケットでBを処理するのが好きではないので、ソケット以外の別の方法を使用したいと思います.... pipe isプロセスBがパイプでプロセスAと話す場合、プロセスBが正常に終了すると、プロセスAの重要パイプサーバーとしてプロセスAが破損します。プロセスAからプロセスBへのデータを取得するための安全な方法が必要です。プロセスBからのデータを取得するのにわずか5秒でさえ、私にとってはうまくいくでしょう。 – barfatchen

答えて

1

あなた必見使用ファイル(@aixが言ったように、より良い方法があるかもしれない)場合は、それらが書き込まれているか、結果は未定義になるようにファイルを読み込むしようとしないでください。

代わりに、別のファイル名にデータを書き込んで閉じてから、正しい場所に移動してください(Linuxではrename())。

好きではない場合は、ファイルロックを使用してみてください。 Linuxでは少なくとも、これらは実際にはファイルへのアクセスを妨げず、プロセス間の相互排他的な役割を果たすだけです。あなたはあなたのOSが何であるかは言いませんが、Linuxの場合はman 2 flockを参照してください。

+0

ありがとう、私はLinuxを使用しています。ファイルb1.txtを開き、別のファイルb2.txtに移動し、プロセスAはb2.txtを読み取り、それは大丈夫でしょうか?プロセスAがb2.txtを同時に読み込もうとしているときに、プロセスBがb2.txtに移動している場合はどうなりますか?私は群れを理解しようとします、あなたの親切な助けに感謝! – barfatchen

+0

'man 2 rename'から:rename()はファイルの名前を変更し、必要に応じてディレクトリ間を移動します。ファイルへの他のハードリンク(link(2)を使用して作成されたもの)は影響を受けません。 oldpathのオープンファイル記述子も影響を受けません。 newpathがすでに存在する場合、それはアトミックに置き換えられ(blah blah blahの対象になる)、newpathにアクセスしようとする別のプロセスが行方不明になることはありません。 – ams

関連する問題