venky4289 has asked for the wisdom of the Perl Monks concerning the following question:

Hi, Can anyone explain me the code line by line .
my $pid = fork; if ($pid > 0){ eval{ local $SIG{ALRM} = sub {kill 9, -$PID; die "TIMEOUT!"}; alarm $num_secs_to_timeout; waitpid($pid, 0); alarm 0; }; } elsif ($pid == 0){ setpgrp(0,0); exec('echo blahblah | program_of_interest'); exit(0); }
thanks in advance.

Replies are listed 'Best First'.
Re: code explanation
by tmharish (Friar) on Mar 06, 2013 at 14:46 UTC

    First off please use code tags so your code is readable - I have done this for you this time around.

    my $pid = fork; if ($pid > 0){ eval{ local $SIG{ALRM} = sub {kill 9, -$PID; die "TIMEOUT!"}; alarm $num_secs_to_timeout; waitpid($pid, 0); alarm 0; }; } elsif($pid == 0){ setpgrp(0,0); exec('echo blahblah | program_of_interest'); exit(0); }

    Documentation for fork will show you that the fork call returns the pid of the forked process to the parent and 0 to the child. This is used above to run the parent through the if and the child through the else above.

    The following should help you understand the rest:

    1. setpgrp
    2. exec
    3. Piped redirection of input and output
    4. How to use Alarm to timeout

    This code essentially creates a process which executes a non-perl program on a timeout.

Re: code explanation
by Anonymous Monk on Mar 06, 2013 at 10:47 UTC