0

数秒ごとに procfs からいくつかのファイルを読み取り、情報を表示しています。毎回ファイルを開いたり閉じたりするのではなく、開いているファイル ハンドルを保持し、終了したらそれらを閉じます。問題は、一貫して古いデータを取得していることです。最初の読み取りから収集された情報が後続の読み取りで返され、procfs ファイルが実際に変更されていることを確認しました。

私が見つけた唯一の回避策は、データを読み取るときに rewind() の前に fflush() を実行することです。これは機能しますが、理由がわかりません。同じファイルを読み書きする 2 つのプログラムがある場合、PRODUCER 側で fflush() が必要になり、これらの変更が消費者に表示されるようになります。ここでは、消費者側で fflush() を実行していますが、動作します。プロデューサとコンシューマのファイル ハンドルが異なるので、コンシューマの fflush() はプロデューサによって書き込まれたデータを fflush() しませんか?

fflush() を使用せずに古いデータを取得し、fflush() を使用して最新の情報を取得する理由はありますか?

4

2 に答える 2

1

正確な答えはわかりませんが、あなたが観察した動作の理由は CONSUMER 側のキャッシュにあると思います。一度に処理しているものよりも大きい可能性が高いブロック単位でファイルを読み取るため、「さらに」要求すると、バッファの「残り」が供給されます。fflush()データを提供する前にキャッシュが破棄されていることを確認します

于 2012-07-15T21:49:40.510 に答える
1

通常、ファイル ストリームはバッファリングされます。つまり、他のプロセスからロックされるのを避けるために、読み取り前にメモリにコピーされます。ハードディスクから継続的に情報を取得するには、ストリームがバッファリングされていないことを確認する必要があります。そのためにはsetbuf (stream,NULL );、バッファがクリアされていることを確認してください。ここで setbuf について読むことができます: http://www.cplusplus.com/reference/clibrary/cstdio/setbuf/

ストリームがバッファリングされていると想定した理由はfflush(stream)、バッファリングされたストリームをクリアするためです。ここでそれについて読むことができます: http://www.cplusplus.com/reference/clibrary/cstdio/fflush/

于 2012-07-15T21:58:53.840 に答える