Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Flush буфера перенаправленного STDIO


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Hunter
Энтузиаст




Зарегистрирован: 14.09.2006
Сообщения: 349

СообщениеПн, 07-Июл-2008 13:58    Заголовок сообщения: Flush буфера перенаправленного STDIO
Цитата

Делаю перенаправление стандартного ввода-вывода (STDIO) из дочернего процесса в основной. Тема известная, литературы и примеров навалом, хотя половина из них с грубыми ошибками.

Все работает, но в некоторых случаях данные передаются не сразу, а либо при переполнении буфера, либо при завершении работы дочернего процесса. Чтобы все было как надо, дочерний процесс должен после каждой записи в STDOUT делать Flush(Output) в дельфи или fflush() - в сях. Некоторые консольные проги этого не делают, например ftp.exe.

Есть ли возможность из основного процесса сделать flush буфера стандартного вывода дочернего процесса? FlushFileBuffer(<хендл другого конца пайпа>) не помогает.

_________________
Никому не двигаться, у меня дракон!
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеПн, 07-Июл-2008 18:21 
Цитата

Почему-то мне кажется, что реализация файлов конкретным компилятором может буфермзовать "у себя", на уровне внутренних файловых структур, создаваемых компилятором. Тогда вызов Flush может сбрасывать "внутренний" буфер, который никакими системными функциями не сбросишь. Вот внутреннее описание текстового файла в Дельфи:
delphi:
  1.  
  2.   //unit System
  3.   TFileRec = packed record
  4.     Handle: Integer;
  5.     Mode: Word;
  6.     Flags: Word;
  7.     case Byte of
  8.       0: (RecSize: Cardinal);   //  files of record
  9.       1: (BufSize: Cardinal;    //  text files
  10.           BufPos: Cardinal;
  11.           BufEnd: Cardinal;
  12.           BufPtr: PChar;
  13.           OpenFunc: Pointer;
  14.           InOutFunc: Pointer;
  15.           FlushFunc: Pointer;
  16.           CloseFunc: Pointer;
  17.           UserData: array[1..32] of Byte;
  18.           Name: array[0..259] of Char; );
  19.   end;

Видно, что тут есть записи, описывающие внутренний буфер.
Я не эксперт в даном вопросе. Могу и ошибаться.

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Hunter
Энтузиаст




Зарегистрирован: 14.09.2006
Сообщения: 349

СообщениеПн, 07-Июл-2008 20:36 
Цитата

При направлении STDOUT в файл, все выводится сразу. А через пайпы - не сразу.

Пробовал еще создавать пайпы с очень маленьким буфером (1 байт) - не помогает. В описании сказано, что размер буфера не окончательный, а ориентировочный.

В принципе, можно не через пайпы STDIO перенаправлять, а через файл (такие примеры имеются). Но это некошерно.
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100