Почему fork иногда возвращает родительский объект, а иногда — дочерний?

Почему fork иногда возвращает родительский объект, а иногда — дочерний?

При выполнении forkвызова для создания нового процесса, если он выполнен успешно, возвращается либо 0(дочерний), либо родительский процесс.

Я не понял, в чем тут идея. Почему forkпросто не всегда возвращается childили всегда parent?

решение1

Когда вы fork(), выполняемый код оказывается запущенным в двух процессах (при условии успешного разветвления): один процесс является родительским, другой — дочерним. fork()возвращает 0 в дочернем процессе и pid дочернего процесса в родительском процессе: это полностью детерминировано.

Вот как вы можете определить после fork(), работаете ли вы в родительском или дочернем процессе. (А также как родительский процесс узнает pid дочернего процесса — ему нужно дождаться его в какой-то момент.)

Немного подробнее:

  • будущий родительский процесс вызывает fork();
  • ядро создает новый процесс, который является дочерним, и соответствующим образом настраивает различные параметры — но оба процесса запущенытот же коди «ждут» возврата от той же функции;
  • оба процесса продолжают работать(не обязательно сразу и не обязательно одновременно, но это не суть):
    • fork()возвращает 0 дочернему процессу, который продолжает работу и использует эту информацию для определения того, что это дочерний процесс;
    • fork()возвращает дочерний pid родительскому процессу, который продолжает работу и использует эту информацию для определения того, что он является родительским.

решение2

Системный fork()вызов «возвращается дважды», всегда (если только не происходит сбой). В родительском процессе он возвращает PID дочернего процесса, а в дочернем — ноль.

Обычный поток -

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 */
}

... или похожие.

Связанный контент