Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Получить вывод программы без буферизации


Автор: octave 4.9.2006, 01:22
нужно запустить утилиту и получать ее вывод в реальном времени, без буферизации. Фунцией sysopen неудается запускать программы, хотя это вроде как аналог open, только без буферизации. 


Код

$|=1;

my $out_tty;
my $n_byte=100;

open(TTY,"mytty.exe -td -b|");
for my $iUP(1..10)
    {
    read TTY,$out_tty,$n_byte;
    print $out_tty;
    sleep 1;
    }

по коду возможно понятнее, чего я хочу добиться...

Автор: Nab 4.9.2006, 07:49
Если что меня поправят, но думаю Вы все верно предполагали, но не угадали с местом smile

Попробуйте вместо read вызвать sysread.

И второе, зачастую терминальная программа буферизирует свой вывод, то есть отдает тоже готовые строки, а не посимвольно... Хотя думаю это может все зависеть еще и от режима, попробуйте binmode включить....

Автор: sharq 4.9.2006, 11:06
octave, используй обычный open и <>, а если хочешь читать блочно, то используй local $/ = \$length;
Подробно смотри perldoc -f open.

Код

local $/ = \1; # размер буффера
open my $fh, '-|', "mytty -td -b" or die "$!";
while (<$fh>) {
  # do smth with $_
}


 smile 

Автор: Nab 4.9.2006, 11:39
sharq, плиз поясни подробней про $/. Насколько я знаю, это разделитель входных строк. А не размер буфера.


Автор: amg 4.9.2006, 12:25
Цитата(octave @ 4.9.2006,  01:22)
по коду возможно понятнее, чего я хочу добиться...

А я так и не понял, чего еще нужно добиться. Вроде, в приведенном коде $| вполне успешно включает/выключает буферизацию... Или я не о том?

Автор: sharq 4.9.2006, 14:48
Nab, 

perldoc -f open
perldoc perlvar $/

для Perl версии 5.8.0 и выше.

 smile 

Автор: octave 5.9.2006, 06:16
Да, проблема была в буферизованном выводе утилиты. В заблуждение меня ввело то, что когда программа работала с терминалом, она выдавала небуферизованный вывод, а когда с пайпом нет (только узнал). Поэтому я думал, что буферизация не используется в ней.

Всем спасибо )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)