2012-02-16 47 views
2

在Erlang中,當所有對資源的引用都消失時,是否可以自動調用清理函數?例如,如果從未調用file:close/1,通過調用file:open/2打開的本機文件句柄是否會關閉?如果這是可能的,它是如何完成的?如果不可能的話,是否有Erlang成語使資源泄漏這樣不成問題?Erlang中的資源清除

回答

5

filedocumentation

IoDevice實際上是一種處理該文件的進程的PID。這個過程與最初打開文件的過程相關聯。如果IoDevice鏈接的任何進程終止,則文件將被關閉,進程本身將被終止。從此調用返回的IoDevice可用作IO函數的參數(請參閱io(3))。

因此,如果打開文件的進程死亡,文件將自動關閉。

如果您使用的是OTP並且您希望確保文件在您的進程死亡時已關閉,請將file:close添加到terminate函數。當然,你的gen_ *必須附屬於主管。

+0

我想我明白了。所以如果你有管理資源的代碼(比如文件),你可以將你的進程鏈接到被調用者的進程。這樣,當被調用者終止並清理時,您的代碼可以處理退出信號。我認爲,即使在被調用者的進程繼續時,如果資源句柄(即IoDevice)被垃圾收集,也不支持類終結者回調。而且,如果是這樣的話,以細粒度的方式使用流程是減少資源泄漏的好辦法(除其他原因外)。 – 2012-02-16 18:18:32

+1

如果你的過程是長期存在的,並且你只使用該文件一段時間,那麼你必須直接調用close函數。如果發生錯誤並且您的進程死亡,則該文件將自動關閉,不需要顯式鏈接。 – Isac 2012-02-16 19:12:47

+1

@FrankHunleth:對於終結狀回調看到在'['try'](http://www.erlang.org/doc/reference_manual/expressions.html#id78318)表達after'子句。它最近被添加到語言中,但它不是如何去做的首選方式。產卵過程和監控或鏈接更方便。 – 2012-02-17 14:20:58