当perl脚本结束时会发生什么?

时间:2016-05-12 23:56:50

标签: bash perl file exception-handling die

这个问题特定于perl,在我特别想知道文件句柄会发生什么变化的情况下(无论是否操作),在某些时候脚本die的句柄打开。

那么当执行到脚本的最后一行时会发生什么操作?脚本级别? Perl级别?壳牌水平(例如bash)?系统级别(例如假设现代* nix,例如Ubuntu)?

这是我到目前为止找到的信息,但没有直接答案:

Best practices for terminating perl scripts

Ensure custom code is run upon exit in perl

Why to close file handles in perl (sys buffers)

dieexit上的Perldoc主要讲述函数本身。

2 个答案:

答案 0 :(得分:1)

Perl使用引用计数策略进行垃圾收集。当变量的引用计数达到0时,在将其内存释放到perl的内存管理系统之前,会调用任何适用的DESTROY方法。

当您的程序终止时,其余变量将超出范围并使其引用计数递减。这是您的文件句柄将关闭的点。

当perl完成清理后,它将退回到操作系统,此时它的剩余资源将返回到操作系统,并且其父进程(可能是init或shell)将被通知退出状态。

引用计数可能出错:如果使用循环引用创建数据结构,则除非您削弱其中一个引用或显式调用其{{1},否则任何组件变量都不会自然地将其引用计数降为0。 } 方法。在这种情况下,变量将持续到程序结束,此时perl将DESTROY和/或垃圾收集所有内容,无论其引用计数如何。

答案 1 :(得分:-1)

如果您的指针/文件处理程序未被适当解除,垃圾收集将执行昂贵的标记/扫描操作。

在perl级别是运行垃圾收集的位置。在shell上,正常的interuptors和错误处理程序仍然会收到IO。在系统级别,垃圾收集将告诉系统调用重新分配内存。