Its been years since I looked at a similar issue, but perhaps another idea for you would be to launch the external command with open() and then use async I/O to read the file handle, perhaps with sysread()? If you use normal buffered synchronous I/O the file handle will "block". Just and idea that might be worth considering. I've done async I/O with Perl before, but its been years ago and I am hazy on the details, but I remember that it worked.