my ($reader,$writer,$cpid); { pipe $reader, local *STDOUT or die $!; pipe local(*STDIN), $writer or die $!; $cpid = fork; defined $cpid or die $!; last if $cpid; # child close $reader or die $!; close $writer or die $!; $| = 1; exec '/path/to/foo', @foo_args; die 'Failed to launch foo: ', $!; } # parent select((select($writer), $| = 1)[0]); # see 'perldoc -f select' # builtin 4-arg select or IO::Select may be handy here # . . . waitpid $cpid;