2016-06-20 13 views
1

私はUbuntuシステム上のSIGCHLDシグナルハンドラのperlシグナルハンドラ関数を扱っています。 sa_siginfoを取得するために、私はsigaction.Nowから得るバイナリデータをアンパックしています。私はsi_codeを "25"として取得しています。それを解釈する方法はhttp://man7.org/linux/man-pages/man2/sigaction.2.htmlを見て?それはビットマスクではなく、価値だと言います。私は取得しています 出力は次のとおりです。si_statusの値を解釈する方法

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

SIGNO、PIDが正しく展開されている、私はそれがだ、私はそれはsi_status(ないsi_code)だ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), 
); 

答えて

0

を取得する方法を理解していないverified.I 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 
+0

おかげで:) ..私は私がsi_codeにとsi_statusの間​​で混乱してしまったと思います。 manページには、それが子供の終了コードであると書かれています。 – Ameyj

+0

いいえ、それはマニュアルページのことではありません。私は既に、終了コード以外のものを返すことができることを示しました。マニュアルページは実際に私がしたのと同じことを言います。マニュアルページを引用し、 'si_status'を解釈する方法を示すだけでなく、アンパック時のいくつかのエラーを修正した私の更新された私の答えを見てください。 – ikegami

関連する問題