atexit(3):`END {}` 或 `$SIG{__DIE__}`?

问题描述 投票:0回答:1

我想知道:当您检测到需要在程序末尾进行清理(不包括“块结束”)时,您希望“对退出处理程序进行排队”,以便稍后进行清理。 在大多数情况下,即使用户按下 ^C (SIGINT),您也希望进行清理,所以我想知道:

当安装可能的多个退出处理程序时,应该使用

END
块来完成,还是应该使用
$SIG{__DIE__}
处理程序来完成(如果是这样,如何对它们进行“排队”?)?

手册说由信号终止的进程会跳过

END
块,这对他们来说是不行的吗? 同样,当进程被信号终止时,是否会调用
$SIG{__DIE__}
处理程序(“man perlvar”对此保持沉默),或者我是否也必须为每个可能的信号安装一个处理程序?

perl signals die atexit
1个回答
1
投票

手册说由信号终止的进程将跳过 END 块...

这是因为除非应用程序本身安装了信号处理程序,否则大多数信号的默认处理程序都是强行终止进程。这意味着在这种情况下应用程序无法运行自己的清理。尽管如此,操作系统的进程清理(关闭文件、套接字等)仍然完成。

如果您想自己进行清理,则需要使用

%SIG
捕获信号。如果您随后从信号处理程序内部调用
exit
,它也会在您的程序中运行
END
函数。请注意,并非所有信号都能被捕获。

请注意,

$SIG{__DIE__}
与此处无关。它不会在信号上被调用,但如果程序抛出致命异常(即
die
)。

© www.soinside.com 2019 - 2024. All rights reserved.