所以,我有一個Linux的過程,其中我試圖管理磁帶上的一些文件。我有以下的代碼,試圖解開一個文件,即catalog.xml,從磁帶上當前存檔,並將其複製到一個固定的位置(最終,我會解析文件和做的結果有一定的工作)。但是,我的代碼間歇性地無法正常工作。 tar命令總是成功,(如果我檢查文件系統,我會看到catalog.xml文件),但是有時我的後續檢查檢查文件是否存在會返回false。我做了什麼明顯錯誤?看起來好像我可能遇到fork()返回的過程和文件系統中可見的進程結果之間的競爭條件 - 是否需要進行一些調用?Linux中進程間的文件I/O?
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回報。 - 焦油命令(-v標誌運行)產生輸出( 「的catalog.xml」)
/TMP是本地tmpfs文件系統的預期一行;磁帶機是本地設備。 我在x86_64盒子上使用g ++ 4.1.2的2.6.30.9 Linux內核。
在此先感謝!
有其他錯誤,可能會導致開放失敗(所有相關的文件系統上使用)。有關文件系統的更多細節會很好。 – 2011-02-14 20:48:10
注意:它execlp的作品,然後永遠不會返回。所以,如果execlp()失敗,只會調用_exit()。你也不檢查vfork()是否真的有效。 – 2011-02-14 20:51:55