|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.11.2012, 19:00 | #1 |
Регистрация: 23.11.2012
Сообщений: 3
|
flush(cout) для дочернего процесса
Добрый день! Прошу помочь! Есть консольная программа (.exe), которая выводит строку на экран каждую секунду, но, видимо, не делает flush. Мне её вывод надо проанализировать в реальном режиме времени из своей программы. Но вот беда: на экран выводит в реальном режиме, а в pipe только когда буфер заполнится (512байт).
Считываю так: handle = _popen("a.exe", "rt"); .... ch=fgetc(handle); Оператор flush добавить в дочернюю программу уже нет возможности. Можно ли что-то сделать? Как-то отключить буферизацию? Спасибо за советы заранее! |
24.11.2012, 14:12 | #2 | |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
Цитата:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
|
24.11.2012, 18:37 | #3 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
setvbuf'ом можно отключить буферизацию при вводе в своей программе, но это не нужно. А проблема, как я понял, в буферизации при выводе в другой программе.
В смысле, это тоже решается setvbuf'ом, только в ту прогу нет его уже нет возможности вставить. Последний раз редактировалось Somebody; 24.11.2012 в 18:40. |
24.11.2012, 18:41 | #4 | ||
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2Somebody
ну если в другой программе нестандартно буферизируется stdout (по дефолту там строковая буферизация), а _popen возвращает file pointer, связанный с тем stdout, то вполне может помочь. Цитата:
http://www.kernel.org/doc/man-pages/...3/popen.3.html Цитата:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось pproger; 24.11.2012 в 18:46. |
||
25.11.2012, 00:53 | #5 |
Регистрация: 23.11.2012
Сообщений: 3
|
Спасибо, братцы, но setvbuf не помогает.
Я сэмулировал такую-же ситуацию: Эта программа отправляет сообщения на экран: int main(int argc, char* argv[]) { for(int i=1;i<=1000;i++) { Sleep(20); printf("%d",i); printf(":Hello World!\n"); // fflush(stdout); } return 0; } Эта считывает: int main(int argc, char* argv[]) { FILE *pPipe; char ch; if( (pPipe = _popen( "cout_test.exe", "rt" )) == NULL ) exit( 1 ); if( setvbuf( pPipe, NULL, _IONBF, 0 ) != 0 ) printf( "Incorrect type or size of buffer for pPipe\n" ); do { ch=fgetc(pPipe); cout<<ch<<flush; }while(ch!=EOF); return 0; } Всё равно выводит по 4096 символов. С чем ещё можно поиграться, чтобы не буферизовалось? p.s. При этом, когда сразу на экран, то выводится нормально, построчно. А другом компьютере, я считал, вроде 512 байт было в буфере. Операционка что-ли буфер создаёт? Или printf определяет, куда поток идет: на экран или в файл? Как бы его обмануть? Последний раз редактировалось wood9oblin; 25.11.2012 в 09:53. |
25.11.2012, 12:46 | #6 | ||
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
Цитата:
Цитата:
|
||
25.11.2012, 15:46 | #7 |
Регистрация: 23.11.2012
Сообщений: 3
|
А есть способ запустить ту программу, как будто с интерактивного устройства (терминала)?
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Linux, создание дочернего процесса, fork() и execl() | Demqieff | Общие вопросы C/C++ | 8 | 20.11.2012 18:27 |
Передача значения из дочернего процесса в родительский | MrGukk | Общие вопросы C/C++ | 0 | 03.09.2012 20:03 |
cout., cin., cout.setf, cout.unsetf | kineziz | Общие вопросы C/C++ | 1 | 06.05.2012 02:50 |
Как вызвать windowproc для дочернего окна | bulldog5293 | Общие вопросы Delphi | 4 | 01.10.2010 14:17 |
Завершение отлаживаемого дочернего процесса | dudeboy | Общие вопросы Delphi | 2 | 05.01.2010 15:34 |