2014-01-17 111 views
1

我有一個問題。如果我在程序正在寫入文件時重命名父目錄,會發生什麼情況

我正在LINUX機器上運行程序。這個程序將輸出寫入「output.txt的」父文件夾「父」

PARENT 
    |________SUB 
      |_________ output.txt 

我不小心改名爲家長而輸出在寫...即的子文件夾內的「子」的文件,我做了以下命令

mv PARENT PARENT_NEW 

到目前爲止我的程序沒有崩潰或任何東西。有沒有人知道我剛剛做了什麼的影響?

+0

根據程序的不同,我希望您移動當前文件,但它將創建一個與原始文件具有相同名稱的新文件。如果文件始終保持打開狀態,我不相信您可以移動它,但如果打開並關閉文件,則可能有兩個文件。 –

+0

我沒有明確移動當前文件..我移動/重命名了它所在的文件夾。 – jmtoung

回答

0

根據UNIX,填充將出現在新的位置。下面是一個簡單的實驗:

$ mkdir /tmp/test 
$ cat > /tmp/test/abc.txt 
hello 
world 

and again! 

因此,儘管cat仍在等待輸入,打開一個新的終端和重命名文件夾:

$ mv /tmp/test/ /tmp/test2 

現在回到前面終端:(按Ctrl+D完成輸入到cat

$ ls /tmp/test/ 
ls: cannot access /tmp/test1/abc.txt: No such file or directory 
$ ls /tmp/test2/ 
abc.txt 
$ cat /tmp/test2/abc.txt 
hello 
world 

and again! 

因此,基本上,除非文件或目錄被完全刪除,這將是存在於噸他寫完後的新位置。

但是,如果過程B刪除文件f而其他一些過程A仍寫入該文件,該文件f將是可用來處理A,因爲它擁有一個inode參考。但是對於其他進程,包括B,它將無法訪問。任何其他進程仍然可以訪問文件f,前提是它可以通過文件描述符/proc/<PID-of-A>/fd獲取對inode的引用。

3

程序通過文件描述符保持文件打開,文件描述符是內核用來訪問文件的無符號整數。你的行爲應該沒有效果。

+0

好的謝謝!希望它沒有效果......會讓你知道發生了什麼。 – jmtoung

4

在Linux上,從Unix繼承而來,一旦本地磁盤上的文件打開,該進程就會處理它。您可以重命名父目錄,甚至可以刪除該文件。只要不關閉並重新打開文件,這些操作不會影響寫入文件的過程。

+0

我剛剛在Mac OS X上試過這個,也是一個Unix後代,重命名文件夾mid-copy並沒有引起任何問題。 – tlehman

+0

不幸的是我不確定程序是否會關閉並重新打開。該計劃是PLINK,一種遺傳分析工具。希望不是。謝謝你的幫助! – jmtoung

+0

那麼,如果它關閉並重新打開文件,它可能會開始拋出錯誤,因爲它想要使用的父目錄不再存在。如果它仍在運行,您可能想要將父母重命名爲可能。 – Harald

相關問題