2016-06-20 10 views
1

나는 Ubuntu 시스템에서 SIGCHLD 신호 처리기를위한 perl 신호 처리기 함수로 작업 중이다. sa_siginfo를 얻으려면 sigaction.Now에서 얻은 이진 데이터를 언 패킹 할 때 "25"로 si_code가 표시됩니다. 저것을 해석하는 방법 http://man7.org/linux/man-pages/man2/sigaction.2.html을 보는가? 그것은 비트 마스 크가 아니라 값이라고합니다. 나는 점점 오전 출력은 다음과 같습니다si_status 값을 해석하는 방법

이 SIGNO는, PID가 올바르게 압축 해제되는
in order : signo sicode sigval sigerro sigpid siuid siaddr sistatus siband 17 0 1 0 21225 0 0 25 0 

, 나는 "si_status"그것은 si_status (안 si_code)의

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

그건로 (25)를 얼마나 이해하지 verified.I 25. (si_codeCLD_EXITED가있는 경우), 또는 프로세스가 상태를 변경시킨 신호 번호

si_status 필드는 자식의 종료 상태를 포함한다. 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

아니요, 맨 페이지가 말하는 것과 다른 것이 아닙니다. 이미 종료 코드가 아닌 다른 것을 반환 할 수 있음을 보여 줬습니다. man 페이지는 실제로 내가 한 것과 똑같은 것을 말합니다. 매뉴얼 페이지를 인용하고'si_status'를 해석하는 방법을 보여주는 것 외에 패키지를 풀 때 약간의 오류를 수정하는 나의 업데이트 된 답변을보십시오. – ikegami

관련 문제