Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^2: fork - alarm - output

by happy.barney (Friar)
on Jun 08, 2010 at 08:11 UTC ( [id://843623]=note: print w/replies, xml ) Need Help??


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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://843623]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (6)
As of 2024-04-23 20:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found