そのため、テープ上のいくつかのファイルを管理しようとしている 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カーネルを使用しています。
前もって感謝します!