| Автор
| Сообщение |
Hunter
Энтузиаст

Зарегистрирован: 14.09.2006
Сообщения: 349
|
|
|
Цитата |
|
Делаю перенаправление стандартного ввода-вывода (STDIO) из дочернего процесса в основной. Тема известная, литературы и примеров навалом, хотя половина из них с грубыми ошибками.
Все работает, но в некоторых случаях данные передаются не сразу, а либо при переполнении буфера, либо при завершении работы дочернего процесса. Чтобы все было как надо, дочерний процесс должен после каждой записи в STDOUT делать Flush(Output) в дельфи или fflush() - в сях. Некоторые консольные проги этого не делают, например ftp.exe.
Есть ли возможность из основного процесса сделать flush буфера стандартного вывода дочернего процесса? FlushFileBuffer(<хендл другого конца пайпа>) не помогает. _________________ Никому не двигаться, у меня дракон! |
|
| В начало |
|
 |
|
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
Почему-то мне кажется, что реализация файлов конкретным компилятором может буфермзовать "у себя", на уровне внутренних файловых структур, создаваемых компилятором. Тогда вызов Flush может сбрасывать "внутренний" буфер, который никакими системными функциями не сбросишь. Вот внутреннее описание текстового файла в Дельфи:
| delphi: | //unit System TFileRec = packed record Handle: Integer; Mode: Word; Flags: Word; case Byte of 0: (RecSize: Cardinal); // files of record 1: (BufSize: Cardinal; // text files BufPos: Cardinal; BufEnd: Cardinal; BufPtr: PChar; OpenFunc: Pointer; InOutFunc: Pointer; FlushFunc: Pointer; CloseFunc: Pointer; UserData: array[1..32] of Byte; Name: array[0..259] of Char; ); end;
|
Видно, что тут есть записи, описывающие внутренний буфер.
Я не эксперт в даном вопросе. Могу и ошибаться. _________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
Hunter
Энтузиаст

Зарегистрирован: 14.09.2006
Сообщения: 349
|
|
|
Цитата |
|
При направлении STDOUT в файл, все выводится сразу. А через пайпы - не сразу.
Пробовал еще создавать пайпы с очень маленьким буфером (1 байт) - не помогает. В описании сказано, что размер буфера не окончательный, а ориентировочный.
В принципе, можно не через пайпы STDIO перенаправлять, а через файл (такие примеры имеются). Но это некошерно. |
|
| В начало |
|
 |
|