2016-06-29 4 views
2

Вопрос был aked о том, сколько A-х должны быть напечатаны после выполнения следующего кода в C:Вилка() команда

int i; 
for (i=1;i<4;i++){ 
    fork(); 
    printf("A"); 
} 

Я насчитал 14 самостоятельно. Тем не менее, после выполнения его asnwer оказался 24. Позже я побежал измененную версию:

int i; 
for (i=1;i<4;i++){ 
     fork(); 
     printf("A\n"); 
} 

помещавшей 14 в. Мне бы хотелось, чтобы кто-то объяснил это мне.

+0

Поскольку вы не проверяете возвращаемое значение 'fork()', я предполагаю, что вы поразите свое максимальное количество процессов. – marcolz

ответ

6

Причина различного количества A - это буферизация строк.

Первая версия не печатает новую строку, поэтому printf фактически не записывается до выхода программы.

Поскольку вызов fork() дублирует весь текущий процесс, он также дублирует буферную линию A.

Затем, когда каждый процесс выходит из него, он сбрасывает свои буферы для вывода.

Вторая версия программы очищает свой вывод при каждом вызове printf из-за новой строки и того факта, что большинство реализаций C очищают буферы в новой строке, если вы печатаете на терминал. (Это не смывать, если вы печатаете в сокет файла или сети.)

+0

Чтобы сделать вашу программу более предикативной, вызовите 'fflush (stdout);' сразу после каждого вызова 'printf'. Таким образом, ничего не остается в стандартном буфере вывода вашего процесса, когда вы переходите к fork. Тогда вы должны получить 14 Как каждый раз. –

0

Это происходит из-за того, что Printf является линия буферизацией, то есть, его буфер получает покраснел только при столкновении с новая линия.

Во втором случае вы положили '\ n', и, следовательно, ожидаемое поведение происходит, как каждый раз, когда буфер очищается.

В первом случае,

После первой вилки():

Buffer : A 

После второй вилки():

Buffer : AA 

После третьей вилки():

Buffer : AAA (3 A's exist in the buffer) 

Итак, наконец, как у вас есть 8 pr полностью исключается, 8 * 3 = 24. Следовательно, 24 A