2017-12-20 26 views
0

주어진 프로세스 P의 프로세스 상태를 하위 P '중 하나에서 얻으려고합니다.리눅스에서 부모 프로세스 상태 가져 오기

나는 함수 waitpid()에 대해 알고 있지만, 문서에서는 자식 프로세스의 상태를 확인하는 데 사용된다고 말했다.

다른 방법이 있습니까?

+0

@Someprogrammerdude, 지정된 pid가 호출 프로세스의 자식이 아닌 프로세스를 식별하면'waitpid()'는'ECHILD'로 실패하는 것으로 문서화됩니다. 나는 OP의 구현이 버그면에서 버그가 있다는 것을 알았지 만, 그렇다면 분명히 그런 버그에 의존하는 것을 권장하지 않을 것이다. –

+0

아이의 부모 프로세스가 죽으면, 고아가 된 아이는'init'으로 이동합니다. 이것은 부모가 더 이상 존재하지 않는 아이를 탐지하는 데 사용될 수 있습니다. 현재이 시점에서 이전 상위 프로세스에 대한 정보는 오래 전에 사라졌습니다. – tofro

답변

2

프로세스가 상위 프로세스가 종료되거나 상위 프로세스의 종료 상태를 기다릴 수있는 표준 기능은 없습니다. 프로세스 트리는 그렇게 작동하지 않습니다. - 아이들은 부모가 출구 할 때 부모에게 통보합니다.

따라서 자녀 과정에서 부모의 사망 사실을 알기를 원할 경우 부모가 적극적으로 부모에게 알리도록 주선해야합니다. 이것은 신호를 보내는 일처럼 보입니다. 학부모가 깔끔하게 퇴장했다는 (즉, main()에서 돌아 오거나 exit()으로 전화하면) 그 사실을 알리는 것만으로 충분할 것입니다. 신호를 선택하십시오 - 아마도 SIGUSR1 또는 SIGUSR2 - 부모 기록부에 해당 신호를 아이들에게 보내는 atexit() 처리기가 있습니다. 부모님께서는 자녀를 계속 추적해야 할 수도 있고하지 않을 수도 있습니다.

부모님의 퇴장 상태에 관해 언급 한대로, 조금 더 원할 것입니다. 두 가지 (또는 그 이상의) 신호 중 어느 신호를 보낼 지 선택하여 어린이에게 대단위 ​​정보를 얻을 수 있지만 IPC 메커니즘이 필요한 자세한 정보를 보려면 공유 메모리 또는 파이프 (또는 그 중 일부)에 종료 상태를 기록하거나, 소켓 또는 메시지 대기열로 메시지를 보내거나, 일반 파일에 상태를 쓰거나, 생각하지 않은 다른 것을 종료 상태로 작성할 수 있습니다.

또한 기존 모델이 매우 잘 작동하고 40 년 동안 완료되었음을 고려해야합니다. 실제로 여러분의 요구를 충족시킬 수는 없겠지만, 유닉스 모델에 더 잘 들어 맞도록 디자인을 개선 할 수 있을지 생각해보십시오.

+0

Thanks, clear and clean answer (y) – Mouley

+0

'atexit()'에 등록 된 함수는 프로그램이 빠른 종료 함수 중 하나를 호출하지 않고 제어를 멈추는 경우에만 호출된다는 점에 유의하십시오. –

+1

좋은 관찰 인 @JonathanLeffler, 어느 정도는 양탄자 밑으로 밀었습니다. 나는 부모 프로세스가'exit()'를 호출하거나'main()'에서 리턴함으로써 종료한다고 가정 한 접근법을 규정했다. 그것이 다른 방법으로 종료된다면, 어린이들이 그것에 대해 듣기 전에 명시 적으로 아동 통지 기계를 작동시킬 필요가있다. 그것은 모든 경우에 일어나기에 의지 할 수는 없습니다. 특히, 'SIGKILL'을받은 결과로 부모가 사망하면 그것은 일어나지 않을 것입니다. –