새 프로세스를 생성하는 호출을 실행할 때 fork
성공하면 0
(하위 프로세스) 또는 상위 프로세스를 반환합니다.
나는 이것 뒤에 숨어있는 아이디어를 이해하지 못합니다. 왜 fork
항상 반환 하지 않거나 child
항상 합니까 parent
?
답변1
을 실행하면 fork()
실행 중인 코드가 두 프로세스에서 실행되고 있음을 알게 됩니다(포크가 성공했다고 가정). 하나는 상위 프로세스이고 다른 하나는 하위 프로세스입니다. fork()
하위 프로세스에서는 0을 반환하고 상위 프로세스에서는 하위 pid를 반환합니다. 완전히 결정적입니다.
이는 나중에 fork()
상위 또는 하위에서 실행 중인지 확인할 수 있는 방법입니다. (또한 상위 프로세스는 하위 프로세스 pid를 어떻게 알 수 있습니까? 어느 시점에서는 이를 기다려야 합니다.)
좀 더 자세히:
- 미래의 상위 프로세스 호출
fork()
; - 커널은 새 프로세스인 하위 프로세스를 생성하고 다양한 항목을 적절하게 설정하지만 두 프로세스가 모두 실행 중입니다.같은 코드그리고 동일한 함수가 반환될 때까지 "대기"합니다.
- 두 프로세스 모두 계속 실행됩니다.(반드시 즉시는 아니고 동시에 반드시 그런 것은 아니지만 그게 요점은 아닙니다):
fork()
자식 프로세스에 0을 반환합니다. 자식 프로세스는 계속해서 이 정보를 사용하여 자식 프로세스인지 확인합니다.fork()
하위 프로세스 pid는 상위 프로세스로 반환되고 상위 프로세스는 계속해서 해당 정보를 사용하여 상위 프로세스인지 확인합니다.
답변2
시스템 fork()
호출은 항상 "두 번 반환"됩니다(실패하지 않는 한). 상위 프로세스에서는 하위 프로세스의 PID를 반환하고 하위 프로세스에서는 0을 반환합니다.
일반적인 과정은
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
run_child_stuff();
exit(0);
} else if (pid > 0) {
run_parent_stuff();
wait(&status); /* wait for child to exit */
} else {
/* handle failure to fork */
}
...또는 유사합니다.