Console redirection issue
От: Chris_kh Финляндия  
Дата: 31.05.05 10:54
Оценка:
У меня проблема с получением данных из stdout buffer . Исходная задача заключается в отображении в cmd того, что выдает другая cmd при записи в stdin buffer команды. Проблема в том, что почему-то не происходит flush для buffer на клиентской стороне, но не для всех команд, а для некоторых. Изначально все сделано на основе "spawn console processes with redirected standard handles" http://support.microsoft.com/kb/q190351/ , только вместо child.exe я запускаю cmd.exe (он для меня child — хотя не очень-то приятно иметь такой child ) В чем моя проблема — запускаем все это удовольствие — оно пытается работать, некоторые комманды типа dir или cd работают "на ура" — результат редиректится со второй консоли на первую, но вот filename completion вырубается, простенький perl script не пашет — ждет ввода и не показывает prompt, а потом выплевывает весь buffer сразу

print "Enter a word:";
$string = readline(STDIN);
chomp $string;
print "\nYou entered:\n$string"

и не редиректится вывод от редактора edit, т.е. во второй cmd он запускается, но не редиректится нифига, понятно, что там всякие escape последовательности будут присутствовать, я даже согласна их парсить, но где они все — не вижу нифига. Кто-нибудь может что-нибудь посоветовать? Похожие вопросы в форумах видела, но что-то в моем случае ничего не сработало. Все готовые примеры затыкаются на тех же проблемах. Может кто-нибудь поможет понять в чем кривизна моих рук?

--Christine
Re: Console redirection issue
От: Chris_kh Финляндия  
Дата: 02.06.05 09:51
Оценка:
Hi All,

Ну что вы все молчите? Может я чего упустила или проблему объяснила непонятно? Или никто на эти грабли не наступал?

Подсунула я вместо cmd приложение printf("Hello world"); ,те же грабли — буферизует, пока не завершится клиентское приложение. Полезла смотреть в CRT как printf работает, так вот похоже с редирекчеными handles он делает буферизацию которую не должен — ошибочка похоже в _FLSBUF.c в функцие _flswbuf()

/* Do NOT get a buffer if (1) stream is stdout/stderr, and
(2) stream is NOT a tty.
[If stdout/stderr is a tty, we do NOT set up single char
buffering. This is so that later temporary buffering will
not be thwarted by the _IONBF bit being set (see
_stbuf/_ftbuf usage).]
*/
if (!( ((stream==stdout) || (stream==stderr))
&& (_isatty(fh)) ))

_getbuf(stream);

вроде забыли перед _isatty() ! поставить как в коментариях написано, получается буферизация, а не должна вроде.
Есть корректный путь как обойти проблему такого плана?

--Christine
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.