If your using *nix, instead of using fork, use my $pid = open( KID, '-|') or die $!; to kick of the child process. The child can then print __LINE__, "\n"; at strategic points (or every line if you wish) and the parent reads from <STDIN> (Updated: Thanks runrig) <KID> to get the line numbers.
See the "Safe pipe opens" section of perlipc for examples.
I couldn't get this to work under Win32 and tried pipe as an alternative, which works except I cannot work out how to get the parent process to detect that the child has closed the pipe? Maybe someone else knows the trick for this?
#! perl -sw
use strict;
use IO::Handle;
pipe(FROM_CHILD, TO_PARENT) or die $!;
TO_PARENT->autoflush(1);
if( my $pid = fork ) { #parent
while( <FROM_CHILD> ) {
chomp;
print "\rChild is processing line:$_ ";
}
print 'Child appears to be finished.'; ## This never reached?
close FROM_CHILD;
}
else {
for (1..10) {
print TO_PARENT __LINE__, $/; select undef, undef, undef, 0.0
+5;
print TO_PARENT __LINE__, $/; select undef, undef, undef, 0.0
+5;
print TO_PARENT __LINE__, $/; select undef, undef, undef, 0.0
+5;
print TO_PARENT __LINE__, $/; select undef, undef, undef, 0.0
+5;
}
close TO_PARENT;
}
Examine what is said, not who speaks.
1) When a distinguished but elderly scientist states that something is possible, he is almost certainly right. When he states that something is impossible, he is very probably wrong.
2) The only way of discovering the limits of the possible is to venture a little way past them into the impossible
3) Any sufficiently advanced technology is indistinguishable from magic.
Arthur C. Clarke.
|