2012-02-16 78 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