Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2012, 19:00   #1
wood9oblin
 
Регистрация: 23.11.2012
Сообщений: 3
По умолчанию flush(cout) для дочернего процесса

Добрый день! Прошу помочь! Есть консольная программа (.exe), которая выводит строку на экран каждую секунду, но, видимо, не делает flush. Мне её вывод надо проанализировать в реальном режиме времени из своей программы. Но вот беда: на экран выводит в реальном режиме, а в pipe только когда буфер заполнится (512байт).

Считываю так:
handle = _popen("a.exe", "rt");
....
ch=fgetc(handle);

Оператор flush добавить в дочернюю программу уже нет возможности.
Можно ли что-то сделать? Как-то отключить буферизацию?
Спасибо за советы заранее!
wood9oblin вне форума Ответить с цитированием
Старый 24.11.2012, 14:12   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Можно ли что-то сделать? Как-то отключить буферизацию?
можно. sevbuf. не уверен, что будет работать с пайпами, да еще и в винде
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:37   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

setvbuf'ом можно отключить буферизацию при вводе в своей программе, но это не нужно. А проблема, как я понял, в буферизации при выводе в другой программе.
В смысле, это тоже решается setvbuf'ом, только в ту прогу нет его уже нет возможности вставить.

Последний раз редактировалось Somebody; 24.11.2012 в 18:40.
Somebody вне форума Ответить с цитированием
Старый 24.11.2012, 18:41   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Somebody
ну если в другой программе нестандартно буферизируется stdout (по дефолту там строковая буферизация), а _popen возвращает file pointer, связанный с тем stdout, то вполне может помочь.

Цитата:
В смысле, это тоже решается setvbuf'ом, только в ту прогу нет его уже нет возможности вставить.
а зачем его вставлять в ТУ прогу, если _popen возвращает нам file pointer
http://www.kernel.org/doc/man-pages/...3/popen.3.html

Цитата:
Note that output popen() streams are fully buffered by default.
очевидно в этом и проблема. если так, то setvbuf гарантированно поможет. (если конечно в ТОЙ программе не было никакой "ручной" пользовательской буферизации )
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.
pproger вне форума Ответить с цитированием
Старый 25.11.2012, 00:53   #5
wood9oblin
 
Регистрация: 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.
wood9oblin вне форума Ответить с цитированием
Старый 25.11.2012, 12:46   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
(если конечно в ТОЙ программе не было никакой "ручной" пользовательской буферизации )
https://www.open-std.org/jtc1/sc22/w...docs/n1570.pdf
Цитата:
At program startup, three text streams are predefined and need not be opened explicitly — standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.
Пайп - это же не интерактивное устройство? Тогда, как я понимаю, там может быть стандартная сишная буферизация stdout.
Somebody вне форума Ответить с цитированием
Старый 25.11.2012, 15:46   #7
wood9oblin
 
Регистрация: 23.11.2012
Сообщений: 3
По умолчанию

А есть способ запустить ту программу, как будто с интерактивного устройства (терминала)?
wood9oblin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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