![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Регистрация: 23.11.2012
Сообщений: 3
|
![]()
Добрый день! Прошу помочь! Есть консольная программа (.exe), которая выводит строку на экран каждую секунду, но, видимо, не делает flush. Мне её вывод надо проанализировать в реальном режиме времени из своей программы. Но вот беда: на экран выводит в реальном режиме, а в pipe только когда буфер заполнится (512байт).
Считываю так: handle = _popen("a.exe", "rt"); .... ch=fgetc(handle); Оператор flush добавить в дочернюю программу уже нет возможности. Можно ли что-то сделать? Как-то отключить буферизацию? Спасибо за советы заранее! |
![]() |
![]() |
![]() |
#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 |
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
![]()
setvbuf'ом можно отключить буферизацию при вводе в своей программе, но это не нужно. А проблема, как я понял, в буферизации при выводе в другой программе.
В смысле, это тоже решается setvbuf'ом, только в ту прогу нет его уже нет возможности вставить. Последний раз редактировалось Somebody; 24.11.2012 в 18:40. |
![]() |
![]() |
![]() |
#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. |
||
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#6 | ||
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#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 |