2010-06-08 4 views
2

주 내 여러 프로세스를 호출하고 해당 프로세스의 PID를 얻을 수 있습니다. 이제이 모든 프로세스가 끝날 때까지 기다렸다가 부모 프로세스에서 공유 메모리 블록을 지우고 싶습니다. 또한 프로세스 중 하나라도 완료되지 않고 segfault가 발생하면 해당 프로세스를 종료하려고합니다. 그래서 부모 프로세스 코드의 프로세스 pid에서 오류가없는 프로세스가 완료되었는지 확인하거나 런타임 오류 또는 다른 원인이 발생하여 프로세스를 종료 할 수있는 방법을 확인하는 방법입니다.프로세스가 실행 중인지 또는 segfaulted되어 있는지 또는 ckey의 내 main()에있는 pid에서 Linux에서 종료되었는지 확인하는 방법

또한 자식 프로세스가 아니지만 해당 PID가 알려진 다른 프로세스의 상태를보고 싶습니다.

코드가 인정됩니다 (스크립트는 없지만 코드는 찾고 있습니다).

+0

자식 프로세스가 아닌 다른 프로세스의 상태를보고 싶지만 그 프로세스의 PID를 알고 싶습니다. – rkb

+0

대개 댓글에 답장하지 않는 한 댓글을 추가하는 대신 직접 질문을 편집하여 더 많은 정보를 추가하는 것이 좋습니다. –

답변

1

프로그램이 segfaults이면이를 죽일 필요가 없습니다. 벌써 죽었어.

waitwaitpid 전화를 사용하여 어린이가 끝내기를 기다리고 나가는 방법에 대한 아이디어를 확인하십시오. 이러한 기능을 사용하는 방법에 대한 자세한 내용은 here을 참조하십시오. 특히 WIFSIGNALEDWTERMSIG 매크로에 유의하십시오.

4

waitpid(2)WNOHANG 옵션으로 살펴보십시오. 매뉴얼 페이지에서 매크로를 사용하여 프로세스의 "운명"을 확인하십시오 (특히 WIFSIGNALED()). (SIGSEGV 특별히 일반적으로 좋은 생각이 아니다 과정에 의해 처리되지 않는 한.)

또한,시키고 말았다 과정은 이미 죽었 응용 프로그램 자체를 종료 할 때 순간을 잡으려고 SIGCHLD 핸들러에서

0

는 waitpid(). 여러 프로세스를 시작하면 WNOHANG이 0을 반환 할 때까지 waitpid()를 루프해야합니다.

프로세스가 아직 실행 중인지 확인하기 위해 신호 0을 사용하여 kill()합니다. IIRC 좀비는 여전히 프로세스로 적합하므로 SIGCHLD 처리기를 올바르게 사용해야합니다.

1

업데이트를 통해 다른 프로세스 (현재 프로세스의 하위 프로세스가 아닌)도 확인하려는 것처럼 보입니다.

당신은 그 중 하나가 될 것 어떤 프로세스가 현재하고있는의 개요를 얻을 /proc/{pid}/status 볼 수 있습니다 :

  • 디스크 (D) 잠을 자고
  • 을 중지 실행

    • (I/O 바운드, 인터럽트 불가능)
    • 좀비

    그러나 일단 프로세스가 죽으면 (완전하게, 좀비가 아니라면)/proc에 엔트리가 생깁니다. 성공적으로 종료했는지, 세그먼 트되었는지, 처리 할 수없는 신호를 포착했는지, 처리 할 수있는 신호를 처리하지 못했는지 여부를 알 수있는 방법이 없습니다. 부모가 해당 정보를 어딘가에 기록하지 않는 한.

    자식 프로세스를 추적하기보다는 시작하지 않은 다른 프로세스에 대한 워치 독을 작성하는 것처럼 들립니다.

  • +0

    음, 네가 절대적으로 옳다. 나는 워치 독을 쓰고있다. 그래서 이것을 코딩하는 방법이있다. – rkb

    +0

    @rkbang PID의 상태 나 PID의 부족을 모두 파싱하면/proc에서 읽는 것이 매우 저렴합니다./usr에서 읽는 것만큼 비용이 많이 들지는 않습니다. 프로세스가 중단되면 두 번째 또는 두 번째로 알 수 있습니다. 불행히도 이유를 알 수 없습니다. 이유를 알아야만하는 경우, 불쾌한 신호를 처리해야 워치 독과 통신 할 수 있습니다. segv의 경우에는 이것이 작동하도록 보장되지 않습니다. 또 하나 주목해야 할 것은 디스크 잠자는 프로세스의 신호 대기열, 예를 들어 사용자가 영구적 인 ioctl에 갇혀있는 것을 죽이려고하는 경우입니다. 더 자세하게 얘기해 주 시겠어요? –

    관련 문제