$SIG'ALRM' 在 Perl 中做了啥
Posted
技术标签:
【中文标题】$SIG\'ALRM\' 在 Perl 中做了啥【英文标题】:What does $SIG'ALRM' do in Perl$SIG'ALRM' 在 Perl 中做了什么 【发布时间】:2018-10-11 13:47:19 【问题描述】:我真的是 shell 脚本 和 Perl 的新手,并试图将 Perl 脚本转换为 Python脚本。
我遇到了以下代码sn-p,我不太清楚。
sub sigalrm_handler
printf (STDOUT "Timeout: Timeout Error Occured.\n");
kill (1, $proc);
exit (1);
sub main
...
...
$SIG'ALRM' = \&sigalrm_handler;
alarm ($ARGV[0]);
shift @ARGV;
$proc = spawn (@ARGV);
wait;
exit ($?);
...
...
main ()
这个$SIG'ALRM'
命令要做什么?它是 Python 中的某种特殊关键字吗?
我已经看到很多使用$SIGALRM
的来源,但没有找到任何来源提到为什么使用它,例如$SIGALRM
,只是为什么不使用其他名称。
这个$SIG'ALRM'
的值在分配之后会是什么?
谁能帮我理解这段代码?
【问题讨论】:
Perl 的内置警报/$SIGALRM 功能。此函数及其相关的信号处理程序允许您安排程序接收 SIGALRM 信号,然后您可以适当地捕获和处理该信号。这里有一个有用的例子docstore.mik.ua/orelly/weblinux2/modperl/ch06_10.htm 【参考方案1】:%SIG
散列为 Unix 信号设置信号处理程序。当内核向 Perl 进程发送信号时,将调用信号处理程序。
alarm 函数指示内核在 n 秒后发送信号。然后将调用 $SIGALRM
处理程序并执行其操作。
在您的特定情况下,信号处理程序将打印 Timeout: Timeout Error Occured.
,杀死存储在 $proc
中的 PID,然后退出程序。
对于 Python 3,Python 等价物可能是 signal 或 signal。
【讨论】:
是否有任何 Pythonic 等价物来完成相同的任务? 你试过谷歌吗?谷歌搜索python signal handler
给了我docs.python.org/2/library/signal.html - 这个库有什么问题?
另外,如果将程序从一种编程语言移植到另一种编程语言,最好至少了解其中一种。您似乎既不了解 Perl 也不了解 Python,因此不妨向您的一位同事寻求帮助。
@anudeep 处理任务超时的pythonic方法是使用async/await,但如果你不知道它们,只需使用signal
。
考虑到还有另一个函数spawn
,接下来要做什么呢? $SIG'ALRM' = \&sigalrm_handler; alarm 50; shift @ARGV; $proc = spawn (@ARGV); wait; exit ($?);
要等50秒干什么?那个发出警报的代码会发生什么?更新了问题中的代码。以上是关于$SIG'ALRM' 在 Perl 中做了啥的主要内容,如果未能解决你的问题,请参考以下文章
elementFormDefault 在 XSD 中做了啥?