我正在为ubuntu系统上的sigchld信号处理程序使用perl信号处理程序函数。
为了得到sau siginfo,我正在解压从sigaction得到的二进制数据,现在我得到的是siu代码“25”。看看如何解释?它说它不是位掩码而是一个值。
我得到的结果是:
in order : signo sicode sigval sigerro sigpid siuid siaddr sistatus siband 17 0 1 0 21225 0 0 25 0
签名,PID正确解包,我确认了。我不明白我怎么得到25作为“Si_状态”
POSIX::sigaction(
POSIX::SIGCHLD,
POSIX::SigAction->new(
sub{
my $args = \@_;
my $pid = unpack "x16S",$_[2];
my($signo,$sicode,$sigval,$sigerro,$sipid,$siuid,$siaddr,$sistatus,$siband) = unpack "iiiiisssii" ,$_[2];
print "\n in order : signo sicode sigval sigerro sigpid siuid siaddr sistatus siband ";
print (join (" ", $signo, $sicode , $sigval , $sigerro ,$sipid ,$siuid ,$siaddr ,$sistatus ,$siband));
}
0,
POSIX::SA_SIGINFO ),
);
最佳答案
是si_status
(不是si_code
)才是25
。si_status
字段包含子的退出状态(如果si_code
是cc>),或导致进程更改状态的信号号。
如果CLD_EXITED
是“cc>”,则用退出代码si_code
正常退出。
如果CLD_EXITED
是si_status
,则该儿童被信号si_code
杀死。
你的开箱有几个错误。它们被固定在下面,它展示了如何解释CLD_KILLED
:
use strict;
use warnings;
use IPC::Open3 qw( open3 );
use POSIX qw( CLD_EXITED );
my $done;
sub sig_child {
my ($signo, $errno, $code, $trapno, $pid, $uid, $status) =
unpack("iiiiiii", $_[2]);
print("$signo $errno $code $trapno $pid $uid $status\n");
if ($code == CLD_EXITED) {
if ($status) {
print("Process $pid exited with error $status\n");
} else {
print("Process $pid completed successfully\n");
}
} else {
print("Process $pid was killed by signal $status\n");
}
$done = 1;
}
POSIX::sigaction(
POSIX::SIGCHLD,
POSIX::SigAction->new(\&sig_child, 0, POSIX::SA_SIGINFO),
);
sub test {
$done = 0;
no warnings qw( once );
open(local *CHILD_STDIN, '<', '/dev/null') or die($!);
open3('<&CHILD_STDIN', '>&STDOUT', '>&STDERR', @_);
sleep(1) while !$done;
}
test('perl', '-e', 'exit(123)');
test('perl', '-e', 'kill(TERM => $$)');
输出:
17 0 1 0 24351 2268518 123
Process 24351 exited with error 123
17 0 2 0 24352 2268518 15
Process 24352 was killed by signal 15
关于linux - 如何解释si_status值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37929679/