in reply to Re: fork - alarm - output
in thread fork - alarm - output

where did you assigned value to $pid ? :-)
You can also miss some data, for example @cmd can handle TERM signal and print partial result. @cmd also can block/not handle TERM signal (or in some case, cannot be KILLed).

Sample:

use strict; use warnings; use IO::Pipe; use constant TIMEOUT => 5; my @cmd = (); my $pipe = new IO::Pipe; if (my $pid = fork) { $pipe->reader; $SIG{ALRM} = sub { kill TERM => $pid; $SIG{ALRM} = sub { kill KILL => $pid; $SIG{ALRM} = sub { close $pipe; }; alarm TIMEOUT; }; alarm TIMEOUT; }; $SIG{CHLD} = sub { while (my $wait = wait) { alarm 0 if $wait == $pid; } }; # alarm here if you want force child to quit after TIMEOUT # alarm TIMEOUT; while (my $from_child = <$pipe>) { # alarm here if you want to interrupt child after inactivity # (no output lines) # alarm TIMEOUT; # ... }; alarm (0); close $pipe; } elsif (defined $pid) { # Child $pipe->writer; open STDOUT, '>&', $pipe; exec @cmd; } else { die "Fork failed: $!\n"; }

Replies are listed 'Best First'.
Re^3: fork - alarm - output
by ikegami (Patriarch) on Jun 08, 2010 at 15:51 UTC

    where did you assigned value to $pid ? :-)

    oops! open returns it. I'll fix it.

    You can also miss some data, for example @cmd can handle TERM signal and print partial result.

    Change the die into a warn if you want to handle partial results.

    Actually, you're the one who misses data. <> is a buffered read, so you'll lose whatever's in the buffer if a timeout occurs. Or maybe it's recoverable by doing another read after the timeout occurs?

    @cmd also can block/not handle TERM signal (or in some case, cannot be KILLed).

    The killing mechanism can be expanded to add a kill KILL => $pid; if the process doesn't end after a certain time. That's easy, and it's outside of what the OP was asking about.

      AFAIK buffered read didn't lost data. My sample didn't use die to break main loop, instead of that i rely on pipe close.

      One critical part is close $pipe in parent's signal handler, it segfaults in perl 5.10.1