
새 프로세스를 생성하기 위해 호출을 실행할 때 fork
성공하면 0
(자식) 또는 부모를 반환합니다.
나는 이것에 대한 아이디어를 얻지 못했습니다. 왜 fork
항상 return child
또는 Always 가 아닌 걸까요 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 */
}
... 또는 유사합니다.