2016-08-09 2 views
1

Если вызов fork() выполнен успешно, Unix будет сделать две идентичные копии адресных пространств, одну для родителя, а другую для дочернего. Оба процесса начнут свое выполнение в следующем заявлении после вызова fork(). [Ref: http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html].Понятия на системный вызов fork()

Так что, если я выполнить следующий код:

#include <stdio.h> 
int main(void) 
{ 
    printf("Hello\n"); 
    fork(); 
    printf("World\n"); 
    return 0; 
} 

Я думаю, что он будет печатать

Hello 
World 
World 

Но когда я запускаю программу печатает

Hello 
World 
Hello 
World 

Пожалуйста, объясните, где мне не хватает концепции?

+0

Странно, я получаю ожидаемый выход. Hello Мир Мир – Rusty

+0

Я думаю, что если вы используете printf(), вы не можете «Hello World World» o/p.корректировать меня, если я ошибаюсь. – Hailey

+0

У вас будет «Hello World World» в качестве вывода, я просто скопировал и скомпилировал код, и получил то же самое, и это то, чего я ожидал. – Rusty

ответ

2

Речь идет о буферизации. Когда вы печатаете «привет», он не выходит на выход сразу. Вместо этого он переходит в буфер. Он все еще присутствует во время вилки, поэтому, когда каждая задача завершается и сбрасывает свой буфер, для отправки на выход две копии.

Чтобы противостоять этому, вы можете указать небуферизованный ввод-вывод или вызвать fflush перед тем, как разблокировать буфер.

+0

@ Гиллс удалил мое упоминание о том, как использовать терминал для вывода терминала. Я все еще думаю, что это стоит упомянуть. Конечно же, 'fflush' тоже работает. Это просто любитель. – Andrew

+0

Я не вижу, что делает его «причудливым». Преимущество 'fflush' состоит в том, чтобы быть проще и всегда работать. Использование терминального ввода работает только в том случае, если вы читаете вход терминала, что часто бывает не так. – Gilles

+0

@ Gilles, моя идея в том, что OP является новичком, поэтому он не знаком с широким спектром системных вызовов. Я хочу ответить простым языком, чтобы он понял эту идею, не вдаваясь в новую документацию. Терминальный ввод-вывод - это то место, где большинство людей начинают работать. – Andrew