매뉴얼 페이지에는 wait(2)
지정된 프로세스가 호출 프로세스의 하위 프로세스가 아닌 경우 waitpid
시스템 호출이 오류를 반환한다고 명시되어 있습니다. ECHILD
왜 이런거야? 자식이 아닌 프로세스를 기다리면 일종의 보안 문제가 발생합니까? 하위 프로세스가 아닌 대기를 구현하는 것이 어렵거나 불가능한 기술적인 이유가 있습니까?
답변1
작동 방식 때문입니다 waitpid
. POSIX 시스템에서는 상위 프로세스의 하위 프로세스가 종료되면 신호(SIGCHLD)가 전달됩니다. 높은 수준에서 waitpid
수행되는 모든 작업은 지정된 프로세스(또는 프로세스 중 하나)에 대해 SIGCHLD 신호가 전달될 때까지 차단됩니다. SIGCHLD 신호가 결코 전달되지 않기 때문에 임의의 프로세스를 기다릴 수 없습니다.
답변2
godlygeek의 답변은 시스템 작동 방식을 이해하는 데 도움이 되지만 필연적으로 발생하는 질문은 다음과 같습니다.
프로세스가 사라졌는지 어떻게 알 수 있나요?
다른 프로세스 그룹이나 세션에서 프로세스를 기다리는 올바른 방법은 를 사용하는 것입니다 kill()
. 분명히 이것은 직관적이지 않은 대답입니다. wait
SIGCHILD 신호가 프로세스에 전달되지 않고 상태 코드를 얻을 수 없기 때문에 이 기능 계열을 사용할 수 없습니다 . kill()
그러나 보낼 신호로 0을 전달하면 특정 프로세스가 종료되는 시점을 알 수 있습니다. 이는 해당 프로세스에 신호를 보낼 수 있는지 간단히 확인하는 것입니다. kill()
시그널링 프로세스 의 반환 값
매초마다 프로세스가 종료되었는지 확인하는 일부 샘플 C 코드는 다음과 같습니다.
int res = kill(pid, 0);
while (res == 0 || (res < 0 && errno == EPERM))
{
sleep(1);
res = kill(pid, 0);
}
마찬가지로 다음 kill
명령을 시도해 볼 수 있습니다.
kill -0 <pid>
이는 pid와 0을 에 전달합니다 kill()
. 일부 쉘에는 이것이 내장되어 있으므로 새 프로세스를 시작하는 것보다 훨씬 효율적입니다 kill
(예 : ).ps