我想知道:当您检测到需要在程序末尾进行清理(不包括“块结束”)时,您希望“对退出处理程序进行排队”,以便稍后进行清理。 在大多数情况下,即使用户按下 ^C (SIGINT),您也希望进行清理,所以我想知道:
当安装可能的多个退出处理程序时,应该使用
END
块来完成,还是应该使用 $SIG{__DIE__}
处理程序来完成(如果是这样,如何对它们进行“排队”?)?
手册说由信号终止的进程会跳过
END
块,这对他们来说是不行的吗?
同样,当进程被信号终止时,是否会调用 $SIG{__DIE__}
处理程序(“man perlvar”对此保持沉默),或者我是否也必须为每个可能的信号安装一个处理程序?
手册说由信号终止的进程将跳过 END 块...
这是因为除非应用程序本身安装了信号处理程序,否则大多数信号的默认处理程序都是强行终止进程。这意味着在这种情况下应用程序无法运行自己的清理。尽管如此,操作系统的进程清理(关闭文件、套接字等)仍然完成。
如果您想自己进行清理,则需要使用
%SIG
捕获信号。如果您随后从信号处理程序内部调用 exit
,它也会在您的程序中运行 END
函数。请注意,并非所有信号都能被捕获。
请注意,
$SIG{__DIE__}
与此处无关。它不会在信号上被调用,但如果程序抛出致命异常(即die
)。