You control the timeout activity with the coderef you assign to $SIG{ALRM}.
There's no requirement to kill or die.
In the test shell script, I increased the delay (to get a few periods of no output) and added a loop (to emulate the stop/start behaviour):
#!/bin/sh
for i in {1..3}; do
echo With newline
echo With newline
echo "NO newline\c"
sleep 10
echo With newline
done
In the Perl script, I just changed
local $SIG{ALRM} = sub { kill HUP => $pid; die "No data\n" };
to
local $SIG{ALRM} = sub { alarm 0; print "No data\n"; alarm $timeout };
Here's the new output:
With newline
With newline
No data
No data
No data
NO newlineWith newline
With newline
With newline
No data
No data
No data
NO newlineWith newline
With newline
With newline
No data
No data
No data
NO newlineWith newline
Perhaps take a look at perlipc: Signals.
This has more information on Signals in general; it also has another $SIG{ALRM} example.
|