微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用数字而不是名称指定Perl信号处理程序

我想在Perl中指定一个信号处理程序,但是使用数字,而不是名称.这可能是一种简洁的方式吗?与杀戮缺乏对称特别突出.例如,而不是
$SIG{USR2} = \&myhandler;

我想说

$SIG{12} = \&myhandler;

我目前最好的是“使用Config”并根据perldoc perlipc中的代码在$Config {sig_name}中查找.这很冗长,似乎不必要地复杂化.

理由:我最近在两个案例中想要这个.

1:我是由一个错误的父进程启动的,他错误地设置了我忽略的信号,我想将所有内容重置为认值.例如http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679630目标将是简单而蛮力的东西:

foreach my $i (1..32) { $SIG{$i} = 'DEFAULT'; }

2:我正在编写一个薄的,尽可能不可见的包装脚本.如果我正在包装的程序以信号退出,我想以相同的信号退出.但是,我捕获了一些信号,所以我需要清除自己的信号处理程序以确保我实际退出而不是进入我的信号处理程序.我的目标是写一些这样简短的东西:

$ret = system("./other-program");
$SIG{$ret & 127} = 'DEFAULT';
kill $ret & 127,$$;

解决方法

一个问题:
use Config qw( %Config );

my @sig_name_by_num;
@sig_name_by_num[ split(' ',$Config{sig_num}) ] = split(' ',$Config{sig_name});

$SIG{$sig_name_by_num[12]} = \&handler;

第二个问题:

use Config qw( %Config );

$SIG{$_} = 'DEFAULT' for split ' ',$Config{sig_name};

-要么-

$SIG{$_} = 'DEFAULT' for keys %sIG;

-要么-

$_ = 'DEFAULT' for values %sIG;

第三个问题

use Config qw( %Config );

my @sig_name_by_num;
@sig_name_by_num[ split(' ',$Config{sig_name});

my $sig_num = $? & 0x7F;
$SIG{$sig_name_by_num[$sig_num]} = 'DEFAULT';
kill($sig_num => $$);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐