这个问题特定于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)
die
和exit
上的Perldoc主要讲述函数本身。
答案 0 :(得分:1)
Perl使用引用计数策略进行垃圾收集。当变量的引用计数达到0时,在将其内存释放到perl的内存管理系统之前,会调用任何适用的DESTROY
方法。
当您的程序终止时,其余变量将超出范围并使其引用计数递减。这是您的文件句柄将关闭的点。
当perl完成清理后,它将退回到操作系统,此时它的剩余资源将返回到操作系统,并且其父进程(可能是init或shell)将被通知退出状态。
引用计数可能出错:如果使用循环引用创建数据结构,则除非您削弱其中一个引用或显式调用其{{1},否则任何组件变量都不会自然地将其引用计数降为0。 } 方法。在这种情况下,变量将持续到程序结束,此时perl将DESTROY
和/或垃圾收集所有内容,无论其引用计数如何。
答案 1 :(得分:-1)
如果您的指针/文件处理程序未被适当解除,垃圾收集将执行昂贵的标记/扫描操作。
在perl级别是运行垃圾收集的位置。在shell上,正常的interuptors和错误处理程序仍然会收到IO。在系统级别,垃圾收集将告诉系统调用重新分配内存。