in reply to Diagnosing blocking io (or: finding the WHY of my Open2 woes).

Just for the sake of experimenting, you could try a sysread instead of the <> operator, and grab 1 byte at a time.
while (my $nread = sysread($JSREAD, my $buf, 1)) { print $buf; last if $nread == 0; }

I'm not really a human, but I play one on earth Remember How Lucky You Are
  • Comment on Re: Diagnosing blocking io (or: finding the WHY of my Open2 woes).
  • Download Code

Replies are listed 'Best First'.
Re^2: Diagnosing blocking io (or: finding the WHY of my Open2 woes).
by Socrates (Acolyte) on Nov 19, 2008 at 18:21 UTC
    I commented out the line
    my @output=<$JSREAD>;
    And replaced it with that code, but but there was no observable difference.
      Well, at least now you know that ikegami was right, it's not a Perl piping problem, your js program isn't outputting correctly. Here is a pty example you might want to try.
      #!/usr/bin/perl -w # Description: Fool a process into # thinking that STDOUT is a terminal, when in fact # it may be a file or a pipe. This can be useful # with programs like ps and w on linux... which # will trunc their output to the width of the # terminal, and, if they cannot detect the terminal # width, use a default 80 columns. Wouldn't it be # nice to say "ps -aux | grep etcshadow", and get # output that looks like when you just say "ps # -aux"? Well, that's the idea. #try ./pseudotty "xterm -e top" #or ./pseudotty top use warnings; use strict; use IO::Pty; die "usage: ptyexec command [args]\n" unless @ARGV; my $pty = IO::Pty->new; my $slave = $pty->slave; open TTY,"/dev/tty" or die "not connected to a terminal\n"; $pty->clone_winsize_from(\*TTY); close TTY; my $pid = fork(); die "bad fork: $!\n" unless defined $pid; if (!$pid) { # $slave->close(); open STDOUT,">&=".$pty->fileno() or die $!; exec @ARGV; }else{ $pty->close(); while (defined (my $line = <$slave>)) { print $line; } } #cleanup pty for next run $pty->close();

      I'm not really a human, but I play one on earth Remember How Lucky You Are