in reply to Re^2: Testing for a background process waiting for input (use a thread)
in thread Testing for a background process waiting for input
Just for the record, a "unixish" implementation of BrowserUk's idea could look something like this:
#!/usr/bin/perl -slw use strict; our $N //= 12; our $I //= 0; my $cmd = qq[exec $^X -E'sleep $N; \$_=<STDIN> if $I; sleep 2; printf +"Kid done (read %d bytes)\\n", length']; my $inInputState = 1; my $timedOut = 0; $SIG{PIPE} = sub { $inInputState = 0; }; $SIG{ALRM} = sub { $inInputState = 0; $timedOut = 1; die }; $SIG{CHLD} = 'IGNORE'; my $pid = open CMD, '|-', $cmd or die $!; alarm 10; eval { syswrite CMD, " \b"x(2**15+1) }; alarm 0; if( $timedOut ) { print "Command timed out"; kill 15, $pid; } if( $inInputState ) { print "Child waiting for input"; } else { print "Kid never entered input state"; } print 'Parent done'; __END__ $ ./detectChildInputState -I=0 -N=2 Kid done (read 0 bytes) Kid never entered input state Parent done $ ./detectChildInputState -I=1 -N=2 Child waiting for input Parent done $ Kid done (read 65538 bytes) $ ./detectChildInputState -I=1 -N=12 Command timed out Kid never entered input state Parent done $ ./detectChildInputState -I=1 -N=9 Child waiting for input Parent done $ Kid done (read 65538 bytes) $ ./detectChildInputState -I=0 -N=9 Command timed out Kid never entered input state Parent done
The main difference revolves around the SIGPIPE signal which on Unix would be delivered to a process if it attempts to write to a broken pipe (this is the case when the child terminates before having read anything).
By default, this signal would terminate the writing process, so it would have to be handled one way or another, anyway (e.g. $SIG{PIPE} = 'IGNORE'). OTOH, we can take advantage of this error notification, in which case we don't need an extra thread (or process) doing the blocking write. The logic is kind of reversed now: we assume things went ok, unless we know otherwise, which is when
in those cases, $inInputState is set to zero in the respective signal handler.
A couple of more notes:
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Testing for a background process waiting for input (use a thread)
by BrowserUk (Patriarch) on Apr 15, 2012 at 01:33 UTC | |
by Eliya (Vicar) on Apr 15, 2012 at 04:22 UTC |