我最近繼承了別人寫過的一些代碼。在Perl中不關閉目錄句柄有什麼含義?
我發現在代碼中無處不在,一個目錄被打開以供閱讀,它從未關閉,因爲原始開發人員有語法問題 - 他正在使用close
函數嘗試關閉目錄句柄而不是closedir
函數。
的代碼是這樣的:
opendir(DIR, $dir) or die "Cannot open $dir: $!\n";
@files = readdir(DIR);
close(DIR);
(這是另一個好點,在有關檢查close
函數的返回Perl的最佳實踐(208278頁)由如果close
返回了。在這種情況下,它會失敗,「壞文件號」)。
我已經改變了這個closedir
,但它讓我開始想知道:由於目錄句柄從未關閉,負面影響是什麼保持長時間打開的目錄句柄?
該程序較大(3,500行代碼),運行一段時間(5-10分鐘),並且該程序的多個實例同時運行。對於上例中的此目錄,$dir
對於所有實例都是相同的值。如果該程序的10個實例同時運行,則它們在同一個目錄下持有5分鐘或更長時間的開放目錄句柄。我相信當程序結束時,Perl會自動關閉目錄句柄,但最好的做法是儘快關閉它。
更明顯的是,如果將文件句柄打開會導致問題(特別是對於可以寫入的文件句柄),但通過不關閉目錄句柄會發生什麼壞事?
我問的原因是因爲這個程序試圖創建一個文件(在上面的$ dir定義的目錄中)有一個奇怪的情況。文件名中嵌入了PID,所以文件已經存在的可能性較小,但Perl無法打開文件進行寫入,因爲它表示它已經存在。當我們查看目錄時,該文件不存在。我想知道是否所有打開的目錄句柄在這個目錄可能會導致這樣的問題?
我不確定操作系統是否有所作爲,但該程序在AIX上運行。
在此先感謝,並且開心的星期五!
即使在今天,一些操作系統對文件描述符(我正在查看*你*,solaris和默認設置64-256)非常吝嗇。 – mob 2010-09-10 18:35:25
@mobrule - 我很抱歉,由於沒有可用的文件描述符,我無法發佈您的評論 - 此致,StackOverflow Solaris後端.... – DVK 2010-09-10 19:50:17