Я пытаюсь изучить программирование в UNIX и натолкнулся на вопрос относительно fork (). Я понимаю, что fork () создает идентичный процесс текущего запущенного процесса, но где он начинается? Например, если у меня есть код
int main (int argc, char **argv)
{
int retval;
printf ("This is most definitely the parent process\n");
fflush (stdout);
retval = fork ();
printf ("Which process printed this?\n");
return (EXIT_SUCCESS);
}
Выход:
Это определенно родительский процесс.
Какой процесс напечатал это?
Какой процесс напечатал это?
Я думал, что это fork()
создает тот же процесс, поэтому я изначально, что в этой программе, fork()
вызов будет рекурсивно вызываться навсегда. Я думаю, что новый процесс, созданный из fork()
запускается после fork()
вызова?
Если я добавлю следующий код, чтобы различать родительский и дочерний процессы,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());
после вызова fork (), где дочерний процесс начинает свое выполнение?
man fork
достаточно уверен, чтобы ответить на ваш вопрос, кстатиОтветы:
Новый процесс будет создан в рамках
fork()
вызова и начнется с возврата из него, как родительский. Возвращаемое значение (в котором вы сохранилиretval
)fork()
будет:Ваш тестовый код работает правильно; он сохраняет возвращаемое значение из
fork()
inchild_pid
и используетif
для проверки, равен ли он 0 или нет (хотя он не проверяет наличие ошибки)источник
Да. Давайте нумеруем строки:
Поток выполнения:
... который объясняет именно то, что вы получили.
Если вы хотите узнать, как оригинальная и разветвленная программа могут вести себя по-разному, поскольку они обязательно используют один и тот же код, см . Ответ Михаила Мрозека.
источник
Реальное решение этого
источник
независимо от того, какой код следует сразу после
fork()
, копируется в дочерний процесс и не смешивает родительский и дочерний процессы, это две разные сущности, которые имеют одинаковую (дублированную, не разделяемую) среду.Теперь посмотрим на ваш вывод ...
источник