Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 结束函数中的清除_Perl - Fatal编程技术网

Perl 结束函数中的清除

Perl 结束函数中的清除,perl,Perl,我的perl脚本使用一个END函数,在这里它取消了一些临时文件的链接。有时脚本会被用户中断或挂起,临时文件不会被删除 在perl中处理这个问题的过程是什么?除非脚本完全运行或执行退出或死亡,否则end函数不起作用 谢谢这里有两个方面。第一种方法是,如果您的程序完成得比较干净,则清理临时文件。为此,您不必重新发明轮子,只需使用核心模块即可。它可以做很多事情,它的好处之一是在垃圾收集变量时删除临时文件 另一个方面是如果发生了真正的程序崩溃(例如,kill-9)。在这种情况下,您的程序无法自行处理清理

我的perl脚本使用一个END函数,在这里它取消了一些临时文件的链接。有时脚本会被用户中断或挂起,临时文件不会被删除

在perl中处理这个问题的过程是什么?除非脚本完全运行或执行退出或死亡,否则end函数不起作用


谢谢

这里有两个方面。第一种方法是,如果您的程序完成得比较干净,则清理临时文件。为此,您不必重新发明轮子,只需使用核心模块即可。它可以做很多事情,它的好处之一是在垃圾收集变量时删除临时文件

另一个方面是如果发生了真正的程序崩溃(例如,
kill-9
)。在这种情况下,您的程序无法自行处理清理。你必须依靠操作系统来完成这项工作。例如,一些Linux发行版定期清理
/tmp
/var/tmp
。您还可以为自己编写一个cron作业来帮助自己

但是,请注意,并非所有Linux发行版都在
/tmp
(或
/var/tmp
)中清理。其他人只在引导过程中这样做。在计算机运行时执行此操作可能有潜在危险(程序仍在使用的文件可能会被意外删除)。有这样的工具可以帮助你


如果您想要一个相当简单的方法,那么我建议您既不要使用
/tmp
也不要使用
/var/tmp
,而是在其中一个目录下使用您自己的子目录,并使用类似
tmpreaper
的工具来清理该目录。通过这种方式,您可以适度地确保只有程序的临时文件(而不是其他程序的临时文件)受到清理的影响。

这里有两个方面。第一种方法是,如果您的程序完成得比较干净,则清理临时文件。为此,您不必重新发明轮子,只需使用核心模块即可。它可以做很多事情,它的好处之一是在垃圾收集变量时删除临时文件

另一个方面是如果发生了真正的程序崩溃(例如,
kill-9
)。在这种情况下,您的程序无法自行处理清理。你必须依靠操作系统来完成这项工作。例如,一些Linux发行版定期清理
/tmp
/var/tmp
。您还可以为自己编写一个cron作业来帮助自己

但是,请注意,并非所有Linux发行版都在
/tmp
(或
/var/tmp
)中清理。其他人只在引导过程中这样做。在计算机运行时执行此操作可能有潜在危险(程序仍在使用的文件可能会被意外删除)。有这样的工具可以帮助你


如果您想要一个相当简单的方法,那么我建议您既不要使用
/tmp
也不要使用
/var/tmp
,而是在其中一个目录下使用您自己的子目录,并使用类似
tmpreaper
的工具来清理该目录。通过这种方式,您可以适度地确保只有您的程序的临时文件(而不是其他程序的临时文件)受到清理的影响。

如果发生真正的程序中断(例如kill-9或Ctrl+C),您可以指定程序应如何处理它


搜索%SIG,您将找到一个示例。

如果实际的程序中断发生(例如kill-9或Ctrl+C),您可以指定程序应如何处理它


搜索%SIG,您将找到一个示例。

在unix系统上,如果文件在删除前已打开,则删除后仍可以使用该文件。如果您实际上不需要文件名(或者如果您可以调整代码,这样您就不需要),这是最可靠的解决方案。的某些函数将为您预删除临时文件。

在unix系统上,如果文件在删除前已打开,则删除后仍可以使用该文件。如果您实际上不需要文件名(或者如果您可以调整代码,这样您就不需要),这是最可靠的解决方案。的某些函数将为您预删除临时文件。

END{}
块仅在Perl本身决定退出时运行。如果由于
SIGTERM
SIGINT
而退出(因为有人在终端上按下了
Ctrl+C
),则该块将不会运行

您可以捕获这两个信号并退出,从而最终导致Perl处理这两个信号。您可以安装信号处理程序:

$SIG{TERM} = $SIG{INT} = sub { exit 1 };

通过
SIGKILL
对死亡没有任何办法,但这种情况应该很少发生。

END{}
块只在Perl本身决定退出时运行。如果由于
SIGTERM
SIGINT
而退出(因为有人在终端上按下了
Ctrl+C
),则该块将不会运行

您可以捕获这两个信号并退出,从而最终导致Perl处理这两个信号。您可以安装信号处理程序:

$SIG{TERM} = $SIG{INT} = sub { exit 1 };

通过
SIGKILL
你对死亡无能为力,但这种情况应该很少发生。

你不能在程序中处理
SIGKILL
(即
kill-9
)。您可以通过(
SIGTERM
)处理正常的
kill
。您不能在程序中处理
SIGKILL
(即
kill-9
)。虽然(
SIGTERM
)你可以处理正常的
kill
。谢谢,我没有想到/tmp。我会把文件存储在那里。谢谢,我没有考虑/tmp。我就把文件放在那里。