perl 脚本结束时会发生什么?
What happens as a perl script ends?
这个问题特定于 perl,在上下文中我特别想知道当脚本 die
s 打开句柄时文件句柄(操作和不操作)会发生什么。
那么当执行到脚本的最后一行时会发生什么操作?脚本级别? Perl 级别? Shell 级别(例如 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 主要讲述函数本身。
如果您的 pointers/filehandlers 没有被适当地消除,垃圾收集将进行昂贵的标记/清除操作。
在 perl 级别是垃圾收集 运行。在 shell 上,正常的中断器和错误处理程序仍将接收 IO。在系统级别,垃圾回收将告诉系统调用重新分配内存。
Perl 使用引用计数策略进行垃圾回收。当变量的引用计数达到 0 时,在将其内存释放给 perl 的内存管理系统之前调用任何适用的 DESTROY
方法。
当您的程序终止时,其剩余变量将超出范围并减少其引用计数。这是您的文件句柄将关闭的点。
当 perl 完成清理后,它将退回到操作系统,此时它剩余的资源将返回给 OS,它的父进程(可能是 init 或 a shell) 将被告知其退出状态。
引用计数可能出错的地方:如果您创建一个带有循环引用的数据结构,none 个组件变量的引用计数自然会降为 0,除非您削弱其中一个引用或显式地调用其 DESTROY
方法。在这种情况下,变量将一直持续到程序结束,此时 perl 将 DESTROY
and/or 垃圾收集所有内容,而不管其引用计数。
这个问题特定于 perl,在上下文中我特别想知道当脚本 die
s 打开句柄时文件句柄(操作和不操作)会发生什么。
那么当执行到脚本的最后一行时会发生什么操作?脚本级别? Perl 级别? Shell 级别(例如 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 主要讲述函数本身。
如果您的 pointers/filehandlers 没有被适当地消除,垃圾收集将进行昂贵的标记/清除操作。
在 perl 级别是垃圾收集 运行。在 shell 上,正常的中断器和错误处理程序仍将接收 IO。在系统级别,垃圾回收将告诉系统调用重新分配内存。
Perl 使用引用计数策略进行垃圾回收。当变量的引用计数达到 0 时,在将其内存释放给 perl 的内存管理系统之前调用任何适用的 DESTROY
方法。
当您的程序终止时,其剩余变量将超出范围并减少其引用计数。这是您的文件句柄将关闭的点。
当 perl 完成清理后,它将退回到操作系统,此时它剩余的资源将返回给 OS,它的父进程(可能是 init 或 a shell) 将被告知其退出状态。
引用计数可能出错的地方:如果您创建一个带有循环引用的数据结构,none 个组件变量的引用计数自然会降为 0,除非您削弱其中一个引用或显式地调用其 DESTROY
方法。在这种情况下,变量将一直持续到程序结束,此时 perl 将 DESTROY
and/or 垃圾收集所有内容,而不管其引用计数。