답변:
로 위키 피 디아는 말한다
유닉스에서 프로세스 ID는 일반적으로 0부터 시작하여 시스템마다 다른 최대 값으로 올라 가면서 순차적으로 할당됩니다. 이 한계에 도달하면 할당이 0에서 다시 시작되고 다시 증가합니다. 그러나이 패스와 후속 패스의 경우 프로세스에 여전히 할당 된 PID는 건너 뜁니다.
"생성"에 대한 매우 간단한 정책입니다. 카운터를 늘리고 "재활용"하면 최대 값으로 숫자를 감싼 다음 완료된 프로세스에 할당 된 숫자를 찾을 때까지 계속 증가시킵니다. 프로세스 테이블에서 제거되었습니다.
AIX와 같은 일부 Unix 구현은 덜 간단한 정책을 사용합니다 (예 : 이 FAQ 참조) .
그건 다양하다.
대부분의 시스템은 마지막으로 생성 된 마지막 PID의 수를 유지하고 하나를 추가 (65535와 같은 최대 수 또는 약간 작은 랩핑-종종 랩은 65000 또는 60000에서 발생)하고 현재 사용 중이 아닌지 확인합니다 ( PID가 여전히 사용 중이면 반복-커널 1 인 PID 1은 여전히 존재하며 '재발급'되지 않습니다).
다른 보안 지향 시스템은 임의로 숫자를 생성하고 사용 중이 아닌지 확인합니다.
주어진 시간에 모든 PID 번호가 고유하다는 것이 보장됩니다.
문제의 재활용 부분과 관련하여 한 가지 명심해야 할 것은 pid가있는 프로세스가 종료되는 즉시 pid를 사용할 수 없다는 것입니다. 해당 프로세스의 부모가 wait () 시스템 호출 형식을 통해 자식의 종료 상태를 수집 할 때까지 pid를 사용할 수 없습니다. 종료되었지만 부모가 대기를 발행하지 않은 자녀를 좀비라고하며 일반적으로 ps에 기능 상실로 표시됩니다. 악의로 행동하는 부모는 자식을 시작하고 기다리지 않으면 pid 시스템을 굶주릴 수 있습니다.
프로세스의 부모가 자식의 상태를 수집하기 전에 죽으면 괜찮습니다. 자식은 wait ()가 발행되고 pid가 재활용되는지 확인하는 init에 의해 상속됩니다.
myprog &
뒤에 wait $!
UB 가 있을 것입니다.