如何解释si_status值

时间:2016-06-20 18:46:46

标签: linux perl signals

我正在使用Ubuntu系统上的SIGCHLD信号处理程序的perl信号处理函数。 为了获得sa_siginfo,我正在解压缩来自sigaction的二进制数据。现在我得到si_code为“25”。看http://man7.org/linux/man-pages/man2/sigaction.2.html如何解读?它说它不是位掩码,而是一个值。 我得到的输出是:

in order : signo sicode sigval sigerro sigpid siuid siaddr sistatus siband 17 0 1 0 21225 0 0 25 0

Signo,pid正确解压缩,我验证了。我不明白我是怎么得到25的“si_status”

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 ),
  );

1 个答案:

答案 0 :(得分:2)

si_status(不是si_code),25

  

si_status字段包含子项的退出状态(如果si_codeCLD_EXITED),或者导致进程更改状态的信号编号。

如果si_codeCLD_EXITED,则子项正常退出,退出代码为si_status

如果si_codeCLD_KILLED,则该孩子被信号si_status杀死。

您的拆包中有一些错误。它们在下面修复,它显示了如何解释si_status

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