Возьмем следующий пример:
int main(void)
{
pid_t pid;
pid = fork();
if (pid == 0)
ChildProcess();
else
ParentProcess();
}
Так исправьте меня, если я ошибаюсь, один раз fork() выполняет дочерний процесс. Теперь переход от answer fork() возвращается дважды. Это один раз для родительского процесса и один раз для дочернего процесса.
Это означает, что возникают два отдельных процесса ВО ВРЕМЯ вызова вилки, а не после его окончания.
Теперь я не понимаю, как он понимает, как вернуть 0 для дочернего процесса и правильный PID для родительского процесса.
Это, где это становится действительно запутанным. В этом ответе указано, что fork() работает, копируя контекстную информацию процесса и вручную устанавливая возвращаемое значение на 0.
Вначале я правильно говорю, что возврат к любой функции помещается в один регистр? Поскольку в одной процессорной среде процесс может вызывать только одну подпрограмму, которая возвращает только одно значение (исправьте меня, если я ошибаюсь здесь).
Предположим, что я вызываю функцию foo() внутри подпрограммы и эта функция возвращает значение, это значение будет храниться в регистре, скажем, BAR. Каждый раз, когда функция хочет вернуть значение, он будет использовать конкретный регистр процессора. Итак, если я могу вручную изменить возвращаемое значение в блоке процесса, я могу изменить значение, возвращаемое функции справа?
Как я правильно понимаю, как работает fork()?