Re: Glib::IO watcher unbuffered? [SOLUTION]
- From: "Philipp E. Letschert" <phil uni-koblenz de>
- To: gtk-perl-list gnome org
- Subject: Re: Glib::IO watcher unbuffered? [SOLUTION]
- Date: Mon, 22 Jan 2007 06:19:58 +0100
On Fri, Jan 19, 2007 at 06:21:57PM +0100, Philipp Letschert wrote:
On Fri, Jan 19, 2007 at 06:15:21AM -0500, zentara wrote:
On Fri, 19 Jan 2007 09:24:53 +0100
"Philipp E. Letschert" <phil uni-koblenz de> wrote:
I would like to have unbuffered output processing from an external command
(command prints a line, sleeps, prints a line, sleeps ...):
It is common behaviour that the C library uses isatty(3) to decide if stdout
is line-buffered or block-buffered. When reading from a pipe to an external
command the output is block-buffered, which explains the reported behaviour.
Solution is using a pseudo-terminal and connect the watcher to it, following is
a complete example:
use Glib;
use IO::Pty;
my $pty = IO::Pty->new;
my $cmd = "external_command -with_args";
my $pid;
unless ($pid = fork) {  # child process
        die "problem spawning program: $!\n" unless defined $pid;
        use POSIX ();
        POSIX::setsid
            or die "setsid failed: $!";
        my $tty = $pty->slave;
        my $tty_fd = $tty->fileno;
 
        open STDIN, "<&$tty_fd" or die $!;
        open STDOUT, ">&$tty_fd" or die $!;
        open STDERR, ">&STDOUT" or die $!;
        close $pty;
        close $tty;
        exec $cmd;
}
my $watcher;
$watcher = Glib::IO->add_watch( fileno( $pty ), ['in', 'hup'], \&callback);
sub callback {
        if ( $pty->eof ) {
                Gtk2::Helper->remove_watch( $watcher );
                close( $pty );
        }
        else {
                my $line = $pty->getline;
                print $line;
        }
}
HTH, Phil
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]