2011-10-07 5 views
2

나는 signalfd()를 사용하여 프로세스에서 생성 된 자식 프로세스의 죽음을 모니터하고있다. 신호로 자식 프로세스를 죽이면 parent는 signalfd_siginfo 구조체가 채워진 fd 신호에서 read 이벤트를 얻습니다. 그것은 자식이받은 신호 번호로 설정된 필드 ssi_code를 가지고 있습니다 (예를 들어, 자식에게 SIGKILL을 보낸 경우 9).signalfd_siginfo 구조체에서 ssi_code를 어떻게 사용합니까?

이 동작을 항상 신뢰할 수 있습니까? signalfd가 지원되는 Linux 커널의 모든 버전은이 필드에서 동일한 사용법을 갖고 있습니까?

주 : 자식이 exit()를 호출하면 exit에 전달 된 코드가 ssi_code에 채워집니다. signalfd 상태

답변

3

man 페이지 : 그것은 분명한 것 같다

The format of the signalfd_siginfo structure(s) returned by read(2)s from a signalfd file descriptor is as follows: 

      struct signalfd_siginfo { 
       uint32_t ssi_signo; /* Signal number */ 
       int32_t ssi_errno; /* Error number (unused) */ 
       int32_t ssi_code; /* Signal code */ 
       uint32_t ssi_pid;  /* PID of sender */ 
       uint32_t ssi_uid;  /* Real UID of sender */ 
       int32_t ssi_fd;  /* File descriptor (SIGIO) */ 
       uint32_t ssi_tid;  /* Kernel timer ID (POSIX timers) 
       uint32_t ssi_band; /* Band event (SIGIO) */ 
       uint32_t ssi_overrun; /* POSIX timer overrun count */ 
       uint32_t ssi_trapno; /* Trap number that caused signal */ 
       int32_t ssi_status; /* Exit status or signal (SIGCHLD) */ 
       int32_t ssi_int;  /* Integer sent by sigqueue(2) */ 
       uint64_t ssi_ptr;  /* Pointer sent by sigqueue(2) */ 
       uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */ 
       uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */ 
       uint64_t ssi_addr; /* Address that generated signal 
             (for hardware-generated signals) */ 
       uint8_t pad[X];  /* Pad size to 128 bytes (allow for 
             additional fields in the future) */ 
      }; 

: ssi_signo 는 시그널 번호가 포함되어 있습니다. 그것은 ssi_code에 대해 다음과 같이 말합니다 :

반환되는 signalfd_siginfo 구조의 모든 필드가 특정 신호에 유효하지는 않습니다. 유효한 필드 세트는 ssi_code 필드에 리턴 된 값으로부터 으로 판별 될 수 있습니다. 이 필드는 siginfo_t si_code 필드의 아날로그입니다. 자세한 내용은 sigaction (2)을 참조하십시오.

하지 신호 번호이 코드에 대한 자세한 내용은 sigaction man 페이지를 참조하십시오.

관련 문제