2017-09-14 8 views
2

부모 프로세스가 자식 프로세스의 종료로 인해 SIGCHLD를 받으면 부모가 해당 자식 프로세스의 죽음을 초래 한 프로세스의 PID를 어떻게 얻을 수 있습니까?상위 프로세스가 하위 프로세스의 종료를 초래 한 프로세스의 PID를 어떻게 찾는가?

+1

불량 복제 :이 질문은 자녀가 아닌 * 부모 *에 대해 묻습니다. – o11c

+0

[SIGCHLD 처리, 자녀가 사망 한 경우 반환 값을 기록하는 방법] (https://stackoverflow.com/questions/5530904) – Martin

답변

0

불행히도 부모는이 정보를받지 못합니다. sigaction(2)에서 :

* SIGCHLD fills in si_pid, si_uid, si_status, si_utime, and si_stime, 
    providing information about the child. The si_pid field is the 
    process ID of the child; si_uid is the child's real user ID. The 
    si_status field contains the exit status of the child (if si_code is 
    CLD_EXITED), or the signal number that caused the process to change 
    state. The si_utime and si_stime contain the user and system CPU 
    time used by the child process; these fields do not include the times 
    used by waited-for children (unlike getrusage(2) and times(2)). In 
    kernels up to 2.6, and since 2.6.27, these fields report CPU time in 
    units of sysconf(_SC_CLK_TCK). In 2.6 kernels before 2.6.27, a bug 
    meant that these fields reported time in units of the (configurable) 
    system jiffy (see time(7)). 

따라서, (어쨌든 SIGKILL 포크하지 않습니다 협력하여 이외의) 정보를 얻을 수있는 유일한 방법은 ptrace(2) 아이에게이며이 신호를 수신 할 때까지 기다립니다.

ptrace의 사용은이 답변에 너무 복잡합니다. 아마도 코드를 strace(1)으로 만들 수 있습니다.이 코드는 ptrace을 방해하지 않고 사용하며 이미 이벤트 필터링을 허용합니다.