#!/usr/bin/perl -slw use strict; our $N //= 12; our $I //= 0; my $cmd = qq[exec $^X -E'sleep $N; \$_= 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