부모 프로세스가 종료 상태를 수집하지 못한 경우 커널이 다시 SIGCHLD 전송을 시도합니다.

Divya

부모 프로세스가 시스템 (커널)이를 통해 보낸 자식 프로세스의 종료 상태를 수집하지 못하면 SIGCHLD자식 프로세스는 좀비 프로세스가됩니다.

시스템은 부모 프로세스가 자식의 종료 상태를 수집하기 위해이 프로세스 종료 상태를 다시 보내려고합니까?

그런 일이 일어나고 좀비 프로세스가 프로세스 테이블에서 제거됩니까?

부모가 자식의 종료 상태를 다시 읽으려고합니까?

필리페 곤살 베스

부모 프로세스가 SIGCHLD를 통해 시스템 (Kernel)에서 보낸 자식 프로세스의 종료 상태를 수집하지 못하면 자식 프로세스는 Zombie 프로세스가됩니다.

이것은 기술적으로 정확하지 않습니다. 좀비 프로세스는 부모가 종료 상태를 가져 오지 못한 프로세스가 아니라 이미 종료되었지만 종료 상태를 얻지 못한 프로세스입니다.

따라서 SIGCHLD부모에게 전달 될 때까지 프로세스는 이미 종료 되었기 때문에 좀비가되었지만 종료 상태는 거두어지지 않았습니다.

요점은 SIGCHLD여기에서 약간 관련이 없다는 것입니다. 부모가 자식의 종료 상태를 얻거나 그렇지 않은 경우 자식이 좀비로 남아 있습니다.

시스템은 부모 프로세스가 자식의 종료 상태를 수집하기 위해이 프로세스 종료 상태를 다시 보내려고합니까?

아니요 SIGCHLD. 정확히 한 번만 전달됩니다. 부모가 신호 처리기에서 좀비의 종료 상태 (필수 사항이 아님)를 얻지 않으면 나중에 수행하거나 (프로그램 코드의 특정 지점에서) 그렇게하지 않고 종료합니다 (이 경우에는 zombie의 부모는 init 프로세스가됩니다. init는 주기적으로 고아의 상태를 가져와 좀비를 정리합니다).

그런 일이 일어나고 좀비 프로세스가 프로세스 테이블에서 제거됩니까?

좀비 프로세스에서 사용하는 리소스는 부모가 종료 상태를 얻는 즉시 해제됩니다.

OTOH SIGCHLD가 명시 적으로 무시 된 경우 (즉, 처리를로 변경하여 SIG_IGN), 무시 SIGCHLD하면 정확히이를 방지 하기 때문에 좀비 프로세스가 없습니다 . 단, 해지 상태는 얻을 수 없습니다.

에서 man 2 sigaction:

POSIX.1-1990은 SIGCHLD에 대한 작업을 SIG_IGN으로 설정할 수 없습니다.

POSIX.1-2001은 이러한 가능성을 허용하므로 SIGCHLD를 무시하면 좀비 생성을 방지 할 수 있습니다 (wait (2) 참조).

그리고 마지막으로:

부모가 자식의 종료 상태를 다시 읽으려고합니까?

일반적으로 부모가 좀비의 종료 상태를 수집 한 후 다시 시도하면 오류가 발생합니다. 앞서 말했듯이 좀비의 종료 상태를 거두면 좀비가 사용하고 있던 모든 리소스가 해제되므로 종료 상태를 한 번 이상 가져올 수 없습니다.

이 규칙의 예외는 WNOWAIT플래그가에 전달되는 경우 waitid(2)입니다. 이 플래그는 자식의 종료 상태를 수집하고 대기 가능 상태로 둡니다. 종료 상태를 가져 오기 위해 동일한 프로세스에서 이후 호출을 다시 사용할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관