$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 中做了啥的主要内容,如果未能解决你的问题,请参考以下文章

BuildContext 在 Flutter 中做了啥?

retranslateUi 在 PyQT 中做了啥

elementFormDefault 在 XSD 中做了啥?

InputStream.available() 在 Java 中做了啥?

=== 在 PHP 中做了啥

“()”在等级声明中做了啥