#! perl -slw use strict; use threads; use threads::shared; our $N //= 12; our $I //= 0; my $cmd = qq[$^X -E"\$|++; sleep $N; if $I; sleep 2;say 'Kid done'"]; my $timeout = time() + 10; my $inInputState :shared = 0; my $pid :shared = open CMD, '|-', $cmd or die $!; my $old = select CMD; $|++; select $old; async { $inInputState = 1 if printf CMD " \b"x2048; }->detach; my $timedOut = 0; Win32::Sleep 10 until !kill 0, $pid or $timedOut = time() > $timeout or $inInputState ; if( $timedOut ) { print "Command timed out"; kill 3, $pid; } if( $inInputState ) { print "Child waiting for input"; } else { print "Kid never entered input state"; } print 'Parent done'; __END__ C:\test>detectChildInputState -I=0 -N=2 Kid done Kid never entered input state Parent done C:\test>detectChildInputState -I=1 -N=2 Child waiting for input Parent done Kid done C:\test>detectChildInputState -I=1 -N=12 Command timed out Kid never entered input state Parent done C:\test>detectChildInputState -I=1 -N=10 Child waiting for input Parent done Kid done C:\test>detectChildInputState -I=0 -N=10 Command timed out Kid never entered input state Parent done