【问题标题】: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 的内置警报/$SIG{ALRM} 功能。此函数及其相关的信号处理程序允许您安排程序接收 SIGALRM 信号,然后您可以适当地捕获和处理该信号。这里有一个有用的例子docstore.mik.ua/orelly/weblinux2/modperl/ch06_10.htm

标签: shell perl process signals alarm


【解决方案1】:

%SIG 散列为 Unix 信号设置信号处理程序。当内核向 Perl 进程发送信号时,将调用信号处理程序。

alarm 函数指示内核在 n 秒后发送信号。然后将调用 $SIG{ALRM} 处理程序并执行其操作。

在您的特定情况下,信号处理程序将打印 Timeout: Timeout Error Occured. ,杀死存储在 $proc 中的 PID,然后退出程序。

对于 Python 3,Python 等价物可能是 signalsignal

【讨论】:

  • 是否有任何 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秒干什么?那个发出警报的代码会发生什么?更新了问题中的代码。
猜你喜欢
  • 2011-02-03
  • 2013-05-11
  • 2010-09-16
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多