2011-02-14 50 views
1

所以,我有一個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內核。

在此先感謝!

+0

有其他錯誤,可能會導致開放失敗(所有相關的文件系統上使用)。有關文件系統的更多細節會很好。 – 2011-02-14 20:48:10

+0

注意:它execlp的作品,然後永遠不會返回。所以,如果execlp()失敗,只會調用_exit()。你也不檢查vfork()是否真的有效。 – 2011-02-14 20:51:55

回答

2

如果execlp成功,它永遠不會得到你打電話_exit行。您沒有從wait檢查返回值(ret)。目前還不清楚爲什麼你應該使用vfork。等

由於除了等待孩子完成,父母沒有做任何其他事情,爲什麼不讓你的生活更輕鬆,只是使用system()

3

嘗試在父wait調用後調用sync

如果不工作,你可能需要循環和/或休眠狀態,直到家長可以打開該文件,因爲你知道它的存在。

+0

到目前爲止,這似乎工作 - 謝謝!一旦我有機會進行更徹底的測試,我會報告回來。 – Sbodd 2011-02-14 21:03:44