【问题标题】:perl multiple sig handlers pointing to one subroutineperl 指向一个子例程的多个 sig 处理程序
【发布时间】:2013-03-28 03:37:55
【问题描述】:

我是 perl 的新手,并尝试向我的脚本添加功能以捕获键盘中断和术语信号(如果抛出),然后发出操作系统命令来处理。在没有信号被抛出并且脚本成功执行的情况下,还需要发出相同的 OS 命令和子命令(注意 END 块)。据我从研究和测试中得知,您必须为每个信号注册一个信号处理程序。在每种情况下,它们都需要触发相同的 sub。这可以在一个 $SIG 中完成,还是我必须同时注册两个,每个信号一个?这是我的代码。

sub issueKdestroy{
    system("kdestroy -q");
    exit(1);
}
$SIG{INT} = (\&issueKdestroy);
$SIG{TERM} = (\&issueKdestroy);
END{
    issueKdestroy();
}

通过测试,这不起作用:

$SIG{'INT', 'TERM'} = (\&issueKdestroy);

它无法识别上述代码中的 INT 或 TERM。 建议?

【问题讨论】:

  • $SIG{INT} = $SIG{TERM} = \&issueKdestroy ?
  • $SIG{$_} = \&issueKdestroy for qw(INT TERM) ?
  • @SIG{'INT','TERM'} = (\&issueKdestroy) x 2 ?
  • @mob 你的第一个答案很完美!非常感谢!

标签: linux perl unix signals


【解决方案1】:

$SIG{'INT', 'TERM'} 不是你的意思;要像这样为两个键分配值,请使用哈希切片(并提供两个值):

@SIG{'INT', 'TERM'} = (\&issueKdestroy, \&issueKdestroy);

使用$ 代替,您正在调用 perl4 样式的多维数组模拟,该模拟允许指定多个键,但将它们全部存储在单个哈希中,相当于:

$SIG{ join $;, 'INT', 'TERM' }

其中$; 默认为chr(0x1c)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2015-01-18
    相关资源
    最近更新 更多