2010-10-25 77 views
0

我很好奇在這個scenero中會發生什麼。假設我打開一個文件進行閱讀,並開始閱讀循環中的內容。像這樣:正在更換文件時讀取

$fp = fopen('test.txt', 'r'); 
while(!feof($fp)) { 
    fread($fp, 1024); 
} 
fclose($fp); 

如果在讀它時另一個進程開始附加到文件,會發生什麼情況?

回答

1

在UNIX/Linux上:

所有進程只是將文件視爲一串長度爲字節的字節。如果其他人更改字節或更改長度,所有其他進程立即看到這個新數據。

打開的文件是指inode。如果你創建一個全新的文件,那麼它是一個新的inode。如果您通過舊文件重命名新文件,目錄中的文件名現在引用新的inode,而您打開舊的inode(即使現在不再可以看到它從任何目錄的任何地方鏈接)。在這種情況下,您將繼續看到舊文件,並且打開/修改新文件的任何進程只能看到新文件。

+0

因此,運行上述代碼的過程並不是如何從操作系統中讀取文件的副本?如果其他進程不斷追加到文件,上面的代碼可以永久循環? – mellowsoon 2010-10-25 17:10:57

+1

「如果其他進程不斷追加到文件中,他上面的代碼可能會永久循環?」是的。看尾巴-f依賴於這種行爲。 – 2010-10-25 17:12:23