1

そのため、テープ上のいくつかのファイルを管理しようとしている Linux プロセスがあります。次のコードは、テープ上の現在のアーカイブからファイル catalog.xml を抽出し、それを固定の場所にコピーしようとします (最終的には、ファイルを解析し、結果を処理します)。しかし、私のコードは断続的に正しく動作しません。tar コマンドは常に成功します (ファイル システムをチェックすると、catalog.xml ファイルが表示されます) が、ファイルが存在するかどうかを確認するフォローアップ チェックで false が返されることがあります。私は明らかに間違ったことをしていますか?おそらく、fork() されたプロセスが返されることと、そのプロセスの結果がファイル システムに表示されることとの間で競合状態が発生しているようです。呼び出す必要があるものはありますか?

  pid_t tPid = vfork();
  if (0 == tPid)
  {
    int tChildRet;
    tChildRet = execlp("tar", "tar", "-xvf", "/dev/nst0", "-C", "/tmp", "catalog.xml", (char *) 0);
    _exit(-1 == tChildRet ? EXIT_FAILURE : EXIT_SUCCESS);
  }
  else
  {
    wait(&ret);
  }
std::ifstream tCatalogFile("/tmp/catalog.xml");
if (tCatalogFile)
{
   cout << "File exists!" << endl;
} else {
   cout << "File does not exist!" << endl;
}

そして、「ファイルが存在します!」というメッセージが表示されます。または「ファイルが存在しません!」、一見ランダムです。

その他の注意事項: 失敗した場合:

  • を実行するstat ("/tmp/catalog.xml")と、-1 が返され、errno が ENOENT に設定されます。
  • tar コマンド (-v フラグを指定して実行) は、予期される 1 行の出力 (「catalog.xml」) を生成します。

/tmp はローカルの tmpfs ファイルシステムです。テープ ドライブはローカル デバイスです。x86_64ボックスでg ++ 4.1.2で2.6.30.9 Linuxカーネルを使用しています。

前もって感謝します!

4

2 に答える 2

3

親でsyncの呼び出しの後に呼び出してみてください。wait

それが機能しない場合は、ファイルがそこにあることがわかっているので、親がファイルを開くことができるまでループまたはスリープする必要があります。

于 2011-02-14T20:45:22.307 に答える
2

execlp成功した場合、それはあなたが呼び出す行に到達することはありません_exitretからの戻り値()をチェックしていませんwait。を使用する必要がある理由は明確ではありませんvfork。等。

親は子供が完成するのを待つ以外に何もしていないので、あなたの生活を楽にして、ただ使ってみsystem()ませんか?

于 2011-02-14T20:47:47.647 に答える