Re: Terminal buffering, oder was?
am 21.01.2007 08:01:28 von PhilAm Fri, 19 Jan 2007 19:06:05 +0000 schrieb Alexander Bartolich:
> Philipp E. Letschert schrieb:
>> [...]
>> Ich frage mich nun ob ich den Perl Code ändern oder das Programm
>> patchen muss, damit es sich dann in Perl so verhält wie im Terminal.
>> Dazu müsste ich aber erstmal wissen was da los ist...
>
> Die C-Laufzeitbibliothek entscheidet üblicherweise anhand von
> isatty(3), ob stdout zeilengepuffert oder blockgepuffert betrieben
> wird.
>
> Wenn das Zielprogramm da nicht mitspielt und explizit setvbuf(3)
> aufruft
Habe da nirgendwo einen Aufruf von setvbuf oder setbuf gefunden, also
verstehe ich das als normales Verhalten, dass die Ausgabe von
$Zielprogramm beim Aufruf aus dem Terminal zeilengepuffert und via Pipe
aus Perl blockgepuffert arbeitet.
> nennt sich die Lösung kurz und knapp "pseudo terminal".
> man IO::Pty
Da ist mir noch nicht klar, wie ich das benutzen muss:
$pty = IO::Pty->new;
$slave = $pty->slave;
open($slave, "$cmd |");
while (!$slave->eof) {
print $slave->getline;
}
soweit richtig?
arbeitet aber immer noch blockgepuffert, also sollte ich irgendwo
setvbuf(?) aufrufen. Die man page sagt mir aber:
WARNING: The IO::Handle::setvbuf() is not available by default on Perls
5.8.0 and later because setvbuf() is rather specific to using the stdio
library, while Perl prefers the new perlio subsystem instead.
Ah toll, es gibt bei PerlIO ein $obj->setlinebuf(FH)
> setlinebuf($slave)
Undefined subroutine &main::setlinebuf called
> PerlIO::setlinebuf($slave)
Undefined subroutine &PerlIO::setlinebuf called
Wo krieg ich denn $obj her? - also auch ziemlich dunkel hier... :)
Xpost & F'up