
При выполнении 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 */
}
... или похожие.