waitpid 시스템 호출을 하위 프로세스에서만 사용할 수 있는 이유는 무엇입니까?

waitpid 시스템 호출을 하위 프로세스에서만 사용할 수 있는 이유는 무엇입니까?

매뉴얼 페이지에는 wait(2)지정된 프로세스가 호출 프로세스의 하위 프로세스가 아닌 경우 waitpid시스템 호출이 오류를 반환한다고 명시되어 있습니다. ECHILD왜 이런거야? 자식이 아닌 프로세스를 기다리면 일종의 보안 문제가 발생합니까? 하위 프로세스가 아닌 대기를 구현하는 것이 어렵거나 불가능한 기술적인 이유가 있습니까?

답변1

작동 방식 때문입니다 waitpid. POSIX 시스템에서는 상위 프로세스의 하위 프로세스가 종료되면 신호(SIGCHLD)가 전달됩니다. 높은 수준에서 waitpid수행되는 모든 작업은 지정된 프로세스(또는 프로세스 중 하나)에 대해 SIGCHLD 신호가 전달될 때까지 차단됩니다. SIGCHLD 신호가 결코 전달되지 않기 때문에 임의의 프로세스를 기다릴 수 없습니다.

답변2

godlygeek의 답변은 시스템 작동 방식을 이해하는 데 도움이 되지만 필연적으로 발생하는 질문은 다음과 같습니다.

프로세스가 사라졌는지 어떻게 알 수 있나요?

다른 프로세스 그룹이나 세션에서 프로세스를 기다리는 올바른 방법은 를 사용하는 것입니다 kill(). 분명히 이것은 직관적이지 않은 대답입니다. waitSIGCHILD 신호가 프로세스에 전달되지 않고 상태 코드를 얻을 수 없기 때문에 이 기능 계열을 사용할 수 없습니다 . 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

관련 정보