2
부모 프로세스가 자식 프로세스의 종료로 인해 SIGCHLD를 받으면 부모가 해당 자식 프로세스의 죽음을 초래 한 프로세스의 PID를 어떻게 얻을 수 있습니까?상위 프로세스가 하위 프로세스의 종료를 초래 한 프로세스의 PID를 어떻게 찾는가?
부모 프로세스가 자식 프로세스의 종료로 인해 SIGCHLD를 받으면 부모가 해당 자식 프로세스의 죽음을 초래 한 프로세스의 PID를 어떻게 얻을 수 있습니까?상위 프로세스가 하위 프로세스의 종료를 초래 한 프로세스의 PID를 어떻게 찾는가?
불행히도 부모는이 정보를받지 못합니다. 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
을 방해하지 않고 사용하며 이미 이벤트 필터링을 허용합니다.
불량 복제 :이 질문은 자녀가 아닌 * 부모 *에 대해 묻습니다. – o11c
[SIGCHLD 처리, 자녀가 사망 한 경우 반환 값을 기록하는 방법] (https://stackoverflow.com/questions/5530904) – Martin