gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:14:20 25 4
gpt4 key购买 nike

我想在 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_num}) ] = split(' ', $Config{sig_name});

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

关于perl - 使用数字而不是名称指定 Perl 信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11621144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com