1

プログラムからTARアーカイブを作成し、アーカイブを開いてさらに処理しようとしています。system()呼び出しとの間に2秒の遅延がありopen()ます。これまでのところ、問題なく動作しますが、なぜ2秒の遅延が必要なのか、それが正しい解決策であるのかはわかりません。

遅延なしで、呼び出しからエラーコード2(ENOENT "No such file or directory")を受け取りますopen()。私の最初の考えは、ファイルシステムがそれ自体を十分に速く更新してopen()おらず、ファイルを見つけることができなかったということでした。しかし、システムが本当にビジーな場合はどうなるでしょうか。もっと長い遅延が必要ですか?open()遅延ではなく成功するまでループする必要がありますか?問題はまったく違うものですか?

UPDATE
ルートファイルシステムはEXT2です。/tmpTMPFSを使用してRAMにマウントされます。アーカイブの内容を抽出するのではなく、アーカイブを作成するtarために使用しています。基本的に、私のプログラムはいくつかのログファイルのアーカイブを作成し、それらをネットワーク経由で送信することになっています(そのため、作成後にアーカイブを開きます)。

int return_value = system("/bin/tar -czf /tmp/logs.tar.gz /var/log/mylogs.log* &> /dev/null");
// error checks on return_value as described here: http://linux.die.net/man/2/wait
if(return_value != 0) {
  return return_value;
}
//usleep(2000000);
return_value = open("/tmp/logs.tar.gz", O_RDONLY | O_LARGEFILE, 0);
// success or failure depending on whether there's a delay or not
4

3 に答える 3

2

プログラムでlibtarを直接使用することで、外部tarコマンドの実行を回避することもできます。


追加した

そして、あなたは私たちにあなたのプログラムを見せるべきです。systemを介してファイルを抽出したばかりの呼び出しが成功したtar直後に利用可能であると確信しています。たとえば、次のようになります。 system

 int err = system("/bin/tar xf /tmp/foo.tar bar");
 int fd = -1;
 if (err == 0)
      fd = open("bar", O_RDONLY);
 // fd is available

このコードで数秒待つ理由はありません。あなたはおそらくもっと複雑なことをしている、またはあなたはの結果をテストするのを忘れたsystem

于 2011-12-19T20:00:55.277 に答える
1

これが私が試すことです:

  1. tarを自分でフォーク/実行し、親にtarの子を収集してもらいます。システムがファイルシステムで競合状態を導入している場合は、子プロセスの作成/取得を制御することが役立つ場合があります。

  2. touch空のファイル(fopen書き込み用およびclose)を作成tarしてから、新しいファイルに追加します。

  3. オプションtarを与える; --verify検証するには、ファイルが存在している必要があります:)

于 2011-12-20T01:08:52.677 に答える
1

tarの出力を「&>」でリダイレクトしていると思いますが、実際にはバックグラウンドで実行しています。これは、system()がたまたま&>をサポートしないシェルを呼び出し、「&」の後に「 >"。遅延により、プログラムはtarが完了するのに十分な時間待機します。

修正は、シェルがサポートする構文を使用するようにコマンドを変更することです。tarからのエラー出力をスローすることは、いずれにせよおそらく間違いです。

于 2011-12-20T19:12:46.057 に答える