加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:45:30 所属栏目:大数据 来源:网络整理
导读:我想在Perl中指定一个信号处理程序,但是使用数字,而不是名称.这可能是一种简洁的方式吗?与杀戮缺乏对称特别突出.例如,而不是 $SIG{USR2} = myhandler; 我想说 $SIG{12} = myhandler; 我目前最好的是“使用Config”并根据perldoc perlipc中的代码在$Config
我想在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 => $$);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读