in reply to Is there any way of determining the current line number of a child process while it is running?

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.
  • Comment on Re: Is there any way of determining the current line number of a child process while it is running?
  • Select or Download Code

Replies are listed 'Best First'.
Re: Re: Is there any way of determining the current line number of a child process while it is running?
by Anonymous Monk on May 01, 2003 at 19:34 UTC
    Thanks guys. I appreciate your help with this. I've been playing around with your idea of piping the line number through a filehandle, but I don't see anyway of doing it without modifying the child script to print __LINE__ every single time. I suppose that I could append that to each and every line of the child script via a filehandle and then execute it. Thanks,

      I can see how adding print __LINE__ to the end of each line of your scripts would be a time consuming, boring and repetative task... Hang on, that sounds like an ideal application for a computer:)

      Install Filter::Simple, put a copy of the following snippet into .../site/lib/Filter/LineTrace.pm

      package Filter::LineTrace; use Filter::Simple; FILTER_ONLY code => sub { s[;\s*$][;print STDERR __LINE__;]mg; }, ; # Replace the next line with 1; print STDERR 'Filter::LineTrace loaded';

      And add use Filter::LineTrace; to the top of your scripts and each line that ends in a /;\s*\n/ will now print its line number to STDERR.

      As-is, the line numbers don't always match the lines exactly, but they are only usually out by 1 if at all, and not every line ends in a semicolon, so they don't all get traced, but it may be enough for your purpose.

      If not, you could add addition substitutions to catch those that end in { or } etc. as required.


      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.