URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5648
[ Назад ]

Исходное сообщение
"конвер."

Отправлено Анд , 18-Авг-06 14:05 
Происходит следующее:
есть два  процесса p1 и p2:
1) в цыкле (выводит на консоль текст и уходит в sleep(2))
2) в цыкде (делаем некие действия (к примеру выводим на консоль символ) и ждем ввод с консоли функцией fgets(...))
делаем коныеер:
./p1 | ./p2
в итоге висим ( судя по всему в функции fgets)...
Объясните пжлста почему и как с этим бороться. Спасибо.

Содержание

Сообщения в этом обсуждении
"P.S.."
Отправлено Анд , 18-Авг-06 14:09 
P.S.
забыл сказать что если sleep убираем , то все ОК .



"P.S.."
Отправлено gyn61 , 18-Авг-06 21:58 
fflush(stdout) после вывода пробовали делать?



"fflush помог. Вопрос такой: (+)"
Отправлено Анд , 06-Сен-06 10:26 
>fflush(stdout) после вывода пробовали делать?
С чем это связано ? Ведь без конвеера все и так работает....
Можно ли как-то это лечить другими способами,
не трогая основное приложение ?


"fflush помог. Вопрос такой: (+)"
Отправлено ACCA , 06-Сен-06 11:11 
>>fflush(stdout) после вывода пробовали делать?
>С чем это связано ? Ведь без конвеера все и так работает....

С буферизацией. p1 ничего не отдаёт в stdout, пока или
1. Не накопится 4K
2. Не пройдёт fflush (который проходит по время exit).

>Можно ли как-то это лечить другими способами,
>не трогая основное приложение ?

"Основное приложение" это P1? Никак не лечится - оно написано неправильно. Либо позаменяй все printf на write, либо сделай setvbuf(stdout, (char *)NULL, _IONBF, 0), либо делай fflush после каждого printf.