7

2番目のプログラムによって読み取られる出力ファイルを以前に書き込んだ2番目の実行可能ファイルを呼び出すには、コード(LinuxではC ++)が必要です。ナイーブなアプローチはありますか、

std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");

out.close()が実行されたとしても、ファイルをすぐに読み取ることができない潜在的な競合状態に悩まされていますsecondprogramか?もしそうなら、これを解決するためのベストプラクティスは何ですか?

3つのメモ:

  • これがファイルシステムに依存している場合、ext3とtmpfsでの動作に興味があります。
  • 明らかに、2番目のプログラムがファイルを開くことができない理由は他にもあります(ファイルのアクセス許可など)。競合状態の可能性に興味があります。
  • 上記の例でハードコードされたファイル名は、簡単にするためのものです。実際には私は使用しますmkstemp
4

3 に答える 3

3

ファイルが閉じられると、書き込まれたすべてのデータがオブジェクトのバッファからフラッシュされることが保証されofstreamます(その時点で、データを失うリスクなしにファイルを破棄でき、実際にファイルを閉じるのはデストラクタによって内部的に行われるためです。必要に応じて)。これは、この時点でデータが物理的にディスク上にあることを意味するわけではありませんが(OSディスクドライバーのキャッシュ動作のため、おそらくそうではありません)、同じOSで実行されているプログラムはファイルを一貫して読み取ることができます( OSがキャッシュされたデータからの読み取りを実行するため)。OSバッファをディスクにフラッシュする必要がある場合(2番目のプログラムが入力ファイルを正しく読み取るために必要ではありません、のsync()関数を確認することをお勧めします<unistd.h>

于 2013-03-26T15:04:57.933 に答える
1

以前に見逃した潜在的な障害モードがあります。ファイルをで開くことができない場合、回復する方法がないようですsecondprogram。問題は、ファイルが戻った後にロックされたり一貫性がなくなったりすることではなく、あなたとはまったく関係のない別のプログラムが、との間でファイルを開く可能性があることです(たとえば、AVスキャナー、ファイルを含むディレクトリを介して誰かがバックアッププロセス)。その場合、プログラムが正しく動作していても失敗します。close()close()system()grepsecondprogram

TL / DR:すべてが期待どおりに機能していてsecondprogramも、ファイルを開くことができない可能性がある場合を考慮する必要があります。

于 2013-03-26T15:13:40.597 に答える
0

cplusplus.comによると、すべてのデータがディスクに書き込まれると、関数が返されます。したがって、競合状態があってはなりません。

于 2013-03-26T14:41:43.807 に答える