Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何解读si_状态值_Linux_Perl_Signals - Fatal编程技术网

Linux 如何解读si_状态值

Linux 如何解读si_状态值,linux,perl,signals,Linux,Perl,Signals,我正在Ubuntu系统上为SIGCHLD信号处理程序使用perl信号处理程序函数。 为了得到sa_siginfo,我正在解包从sigaction获得的二进制数据。现在我得到的si_代码是“25”。看看如何解释这一点?它说它不是位掩码,而是一个值。 我得到的结果是: in order : signo sicode sigval sigerro sigpid siuid siaddr sistatus siband 17 0 1 0 21225 0 0 25 0 签名,pid正确解包,我核实过了。

我正在Ubuntu系统上为SIGCHLD信号处理程序使用perl信号处理程序函数。 为了得到sa_siginfo,我正在解包从sigaction获得的二进制数据。现在我得到的si_代码是“25”。看看如何解释这一点?它说它不是位掩码,而是一个值。 我得到的结果是:

in order : signo sicode sigval sigerro sigpid siuid siaddr sistatus siband 17 0 1 0 21225 0 0 25 0
签名,pid正确解包,我核实过了。我不明白我怎么会得到25分作为“si_状态”


这是
si_status
(不是
si_code
)这是
25

si_status
字段包含子进程的退出状态(如果
si_code
CLD_exit
),或导致进程更改状态的信号号

如果
si\u code
CLD\u退出的
,则子项以退出代码
si\u状态正常退出

如果
si\u code
CLD\u杀死
,则子项被信号
si\u状态杀死


您的解包中有一些错误。它们固定在下面,它显示了如何解释
si_状态

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 => $$)');

谢谢:)。。我想我把si_代码和si_状态搞混了。手册页上说这是孩子的退出代码。不,这根本不是手册页上说的,我已经展示了它可以返回退出代码以外的内容。手册页上说的和我做的一样。请参阅我更新的我的答案,除了引用手册页并说明如何解释
si_状态
外,它还更正了解包中的一些错误。
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