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

Only if the child prints less than a pipe's buffer's worth of information (64k?). That's very small these days.

Replies are listed 'Best First'.
Re^5: fork - alarm - output
by BrowserUk (Patriarch) on Jun 08, 2010 at 16:50 UTC
    Only if the child prints less than a pipe's buffer's worth

    That (conservatively), probably covers 85% of the uses of such code. Are you telling me that you don't see a relatively simple modification to cater for the rest?

    I mean without resorting to forks & execs and no-blocks and selects and events&globals, state-driven spaghetti code?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      That (conservatively), probably covers 85% of the uses of such code.

      I don't buy that statistic. Either way, it sounds like you're saying 1 failure in 5 attempts is ok!

      Are you telling me that you don't see a relatively simple modification to cater for the rest?

      Are you saying we're suppose to assume everyone knows that modification is needed and that it was there all along, whatever it might be?

      Anyway, I don't call the following a simple modification.

      my $pid = open IN, '-|', qq[ perl -E"say scalar localtime, sleep 1 for 1.. $ARGV[0]" ] or die $!; my $buf = ''; if (!do { local $SIG{ ALRM } = sub { kill -9, $pid; }; alarm 5; $buf .= $_ while <IN>; waitpid($pid, 0); alarm 0; die("Can't waitpid: $!\n") if $? == -1; die("Child killed by signal ".($? & 0x7F)."\n") if $? & 0x7F; die("Child returned error ".($? >> 8)."\n") if $? >> 8; 1 }) { waitpid($pid, 0); die("Timeout\n"); }
        It sounds like you're saying 1 failure in 5 attempts is ok!

        Oh give over. Is that really how you read that?

        It never crossed your mind that I meant that if the programmer knows his program outputs more than the simple solution can handle, then he considers using the "more complex" solution?

        Not that it needs to be much more complex: A whole 3 lines:

        #! perl -slw use strict; use threads; my $pid = open IN, '-|', qq[ perl -E"\$t=time; say ~~localtime, select'','','',.0001 while time() < + \$t + $ARGV[0]" ] or die $!; async { eval { local $SIG{ ALRM } = sub { kill -9, $pid; warn 'timeout'; }; alarm 5; waitpid $pid, 0; alarm 0; }; }->detach; while( <IN> ){ print; } __END__ c:\test>junk 4 >junk.log c:\test>dir junk.log 08/06/2010 17:58 13,703,760 junk.log c:\test>junk 6 >junk.log timeout at C:\test\junk.pl line 13. c:\test>dir junk.log 08/06/2010 17:58 22,759,264 junk.log

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.