fork () движется к началу main () - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующий код:

#include <stdio.h>

int main() {
    printf("Hello\n");
    fork();
    return 0;
}

Это дает вывод:

Hello

Как и ожидалось.Но если я изменю код на:

#include <stdio.h>

int main() {
    printf("Hello");
    fork();
    return 0;
}

Удаление, \ n выдаст:

HelloHello

Почему printf вызывается два раза.Разве дочерний процесс не должен выполнять следующую инструкцию: return 0;

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Это не вызывается дважды.Помните, что подключенный к консоли stdout по умолчанию является линейным буфером.Так как вы не завершили свой аргумент printf новой строкой, он еще не перейдет на консоль.Сначала он пойдет только в буфер.Таким образом, printf("Hello"); копирует "Hello" в выходной буфер, fork() создает копию процесса с копией адресного пространства (включая выходной буфер stdout со строкой "Hello") и return 0; возвращает управление обратно в libc, что очищает выходной буфер, но поскольку это происходит после fork(), это произойдет дважды - один раз в родительском и один раз в дочернем, и вы получите "HelloHello" вокончательный вывод.

0 голосов
/ 19 декабря 2018

Вызов функции printf помещает символы hello в буфер, связанный с потоком stdout.Впоследствии буфер очищается при выходе из процесса, и именно тогда мы видим вывод.Вы разветвились до того, как это произошло, поэтому два процесса выполняют очистку буфера в двух отдельных адресных пространствах при выходе из каждого из них.У каждого процесса есть копия потока с буфером и его содержимым hello.

Когда поток stdout подключен к интерактивному устройству (например, TTY в Unix), он буферизуется в строке.,Буферизация строки означает, что буфер очищается всякий раз, когда выводится символ новой строки.

Если мы очищаем буфер до fork (например, путем печати новой строки или путем вызова fflush(stdout)), тогда очистка происходит вродительский процесс.Буфер пуст в момент времени fork;хотя дочерний процесс наследует его копию, в обоих процессах нечего очищать.

В дублированном случае вывода что-то на самом деле вызывается дважды.Это просто не printf, а системный вызов write, который отправляет буферизованные символы на устройство вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...