linux - 指向一个子例程的 perl 多个 sig 处理程序

标签 linux perl unix signals

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

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

从测试来看,这不起作用:

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

它不会识别上面代码中的 INT 或 TERM。 有什么建议吗?

最佳答案

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

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

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

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

默认情况下,$;chr(0x1c)

关于linux - 指向一个子例程的 perl 多个 sig 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838719/

相关文章:

c - system() 的返回码

c++ - 为 ardor boost "too old"并且不会安装

Java,从 Java 代码中控制 Linux 服务器的正确方法?

linux - qmake分别匹配linux和mac

perl - DBD::SQLite 插入多行最快的方法

linux - sed 中的环境变量替换

linux - Makefile 'ifneq' 语法错误,Broadcom BCM43142

perl - 全局符号 "@str"需要显式包名称

正则表达式帮助匹配

c - 为什么需要保存集用户 ID?