in reply to Time out

Please try the search function in the upper left corner of your browser before posting. By using 'Timeout' I found this and this both of which seem to answer the question you have asked.

--t. alex

"Mud, mud, glorious mud. Nothing quite like it for cooling the blood!" --Michael Flanders and Donald Swann

Replies are listed 'Best First'.
Re: Re: Time out
by janx (Monk) on Jun 18, 2002 at 15:27 UTC
    Both of these examples are fine for stuff that doesn't do any calls to system or exec.

    But that's probably exactly what he wanted to do.
    The quick answer is: Read perlipc and go on from there.

    Long answer: working on that ;-)

    Update: Here's the long answer:

    #!/usr/bin/env perl use strict; use warnings; use POSIX qw/:sys_wait_h/; my $child_pid = undef; my $status = fork; die "failed to fork\n" unless defined $status; if ($status > 0) { # this is the parent process. local $SIG{ALRM} = sub { print STDERR "operation timed out for PID $ +status\n"; kill 9, $status }; alarm 10; my $pid = 0; do { $pid = POSIX::waitpid ($status, POSIX::WNOHANG); } until ($pid > 0); alarm 0; } else { # this is the child process. system "ssh a_server_could_hang"; }

    For any non-portability hit your OS vendor :-(

    Kay

      Your short answer is correct, but your solution doesn't work on AIX at least. It suffers from the same problem as the normal 'alarm' solution -- the parent dies, but the child (or grandchild in this case) lives on.

      The kill doesn't kill the grandchild created by system (even if you use -9 instead of a 9). Also, I'm not sure why you are using an alarm loop around a non-blocking waitpid. It's just going to spin the CPU for 10 seconds. You should either use alarm with a blocking waitpid or just poll/sleep/poll with the non-blocking one.

      bluto