in reply to Pipes: Why does this fail?

Two things: first, don't use tail -f on the pipe. Just open it as if it were a file. Second, as long as you don't actually write a newline to the pipe, the <OUT> will block.

Note that with those changes, your program will still hang (after printing out 12345678901234567890123456789012345678901234567890) as you never write more to the pipe, and the <OUT> will wait till you do.

Replies are listed 'Best First'.
Re^2: Pipes: Why does this fail?
by cmv (Chaplain) on Aug 26, 2010 at 14:31 UTC
    JavaFan++

    Thanks for the quick help. I've modified the test script (see below) and it now works as expected.

    One question though. Using the tail -f line below causes the script to fail, reverting to the cat line makes it work. I don't understand why?

    Thanks

    -Craig

    use strict; use warnings; use FileHandle; # Create named pipe... my $pipe = "/tmp/mypipe"; system("ksh -c 'if [ ! -p $pipe ]; then mkfifo $pipe; fi'"); # Setup input process... open(IN, '|-', "cat - > $pipe") || die "Can't open IN process: $!"; IN->autoflush(1); # Setup output process... #open(OUT, '-|', "tail -f $pipe") || die "Can't open out process: $!"; open(OUT, '-|', "cat $pipe") || die "Can't open out process: $!"; OUT->autoflush(1); my $i=0; print STDERR "Sending input...\n"; print IN "This is message $i\n"; # Read output... print "Reading...\n"; my $line; while($line = <OUT>) { $i++; print $line; print IN "This is message $i\n"; sleep 1; }
      My guess would be that 'tail -f' first tries to seek to the end - but a named pipe isn't seekable. Why it doesn't die, I do not know.