포크가 때로는 부모를 반환하고 때로는 자식을 반환하는 이유는 무엇입니까?

포크가 때로는 부모를 반환하고 때로는 자식을 반환하는 이유는 무엇입니까?

새 프로세스를 생성하기 위해 호출을 실행할 때 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 */
}

... 또는 유사합니다.

관련 정보