Fork() ОС. 4 hi выходит в ожидании 3 hi

81
6

for(i=0;i<2;i++)
if(fork()==0)
printf("Hi");

Я ожидаю 3 привет и получаю 4 привет
SO я отредактировал printf как printf("Hi %d %d %d ",i,getpid(),getppid());
Первый созданный ребенок печатает два hi с одинаковым значением я i.e 0, а его pid и родительский pid также совпадают. Зачем?

спросил(а) 2016-04-28T09:21:00+03:00 4 года, 6 месяцев назад
1
Решение
59

Это довольно интересно и похоже, что ответ выводит буферизацию. Например, мы имеем:


#include <unistd.h>
#include <stdio.h>

int main() {
for(int i=0;i<2;i++) {
if(fork()==0) {
printf("Hi %d %d %d\n",i,getpid(),getppid());
}
}
}


Если запустить этот код в терминале, будет 3 строки, но если я перенаправляю вывод на меньшее, будет четыре!


Если мы сбросим буфер после printf(), проблема исчезнет:

  // ...
printf("Hi %d %d %d\n",i,getpid(),getppid());
fflush(stdout);
// ...

Это происходит потому, что stdout буферизуется, поэтому, когда процесс разветвляется, буфер еще не очищается.


От man stdout:


Строка stderr не загружена. Строка потока буферизованная строка, когда она указывает на терминал. Частичные линии не будут появляются до тех пор, пока не вызывается fflush (3) или exit (3) или не печатается новая строка. Это может привести к неожиданным результатам, особенно при отладке выход.


ответил(а) 2016-04-28T20:14:00+03:00 4 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема