Страницы

Поиск по вопросам

понедельник, 10 декабря 2018 г.

Как работает функция fork() в C. Не могу понять результат работы программы

У меня есть вот такой короткий пример кода, нам его дали что бы продемонстрировать работу функции fork():
#include #include #include #include int main () {
pid_t pid; pid = fork(); pid = fork();
printf("Fork-Test
");
return EXIT_SUCCESS; }
Мне не совсем понятен результат. В итоге у меня 4 раза в терминале пишет Fork-Test Не понимаю, во-первых почему это происходит больше одного раза, ведь я вызваю метод printf("Fork-Test
"); только один раз, во-вторых, раз уже несколько раз, то почему именно 4? При чем еще и в следующем виде:
Fork-Test Fork-Test
Process returned 0 (0x0) execution time : 0.007 s Press ENTER to continue Fork-Test Fork-Test
смысл мне не понятен. буду благодарна за любые пояснения по поводу fork()


Ответ

Процесс после системного вызова fork, раздваивается, у исходного процесса создаётся идентичный потомок-двойник в идентичном состоянии (ну почти). Создавшийся процесс будет занят выполнением того же кода ровно с той же точки, что и исходный процесс.
Различить кто создал, а кто создался, можно по возвращаемому значению fork, поэтому его результат обычно передаётся в if, чтобы эти процессы выполнили какие-то разные вещи, один пошёл в ветку if, другой в ветку else
Вы же возвращаемое значение игнорируете (сохраняете, но никак не используете), и потому оба процесса продолжают идти по одному и тому же пути. И натыкаются на ещё один вызов fork. И каждый из них раздваивается снова. Получается следующая картина:
P # перед первым pid = fork();
[fork 1]
P # перед вторым pid = fork(); \ P(1) # перед вторым pid = fork();
[fork 2]
P # перед printf("Fork-Test
"); / \ P(2) P(1) # перед printf("Fork-Test
"); # перед printf("Fork-Test
"); \ P(1)(2) # перед printf("Fork-Test
");
После второго форка процессов уже 4. И после этих форков каждый процесс доходит до вызова printf и выводит указанную строку. Каждый процесс делает это сам. Поэтому вывод происходит столько раз, сколько вышло процессов.
Можете убедиться в этом, поместив вывод перед вторым форком (вывод произойдёт дважды) или перед первым (единожды).
Завершаются они независимо друг от друга. У вас получилось, что процесс P завершился вторым. А нечто, через что вы запускали этот процесс, следило только за процессом P, но не его "клонами" (т. к. у них собственные pid, process ID), поэтому для остальных такого вывода нет.

Комментариев нет:

Отправить комментарий