http://www.perlmonks.org?node_id=413544


in reply to How to get child pid from backtics

If you require that you parent script have full control over the 'blastall' child, I really advise you to use fork, for exemple :
my $pid = fork; die unless defined $pid; if ($pid) { # Parent. Do whatever you want } else { # Child do 'blastall.pl'; }

--
zejames

Replies are listed 'Best First'.
Re^2: How to get child pid from backtics
by Hena (Friar) on Dec 10, 2004 at 08:41 UTC
    UPDATE: Ok, got it fixed. Shoud be $kid = waitpid(-1,0). I quite don't understand how it matches the correct PID, but this seems to be working.

    I'm having problems with the execution and fork. Probably as I have never used it before. So is this correct way to use it? Where does the waitpid go and how does it work? How the program flow go from here?
    #!/usr/bin/perl # # Wrapper takes is the arguments of the blastall binary # changes directory to binarys directory # adds binary name # runs it # Needs to be able to trap normal signals and definedly kill the proce +ss, # as it ignores some which it should not. # use warnings; use strict; use File::Basename; use sigtrap qw(handler catch_signal normal-signals); my $pid; # blastalls pid after fork sub catch_signal { print STDERR "SIGNAL:",shift," blast should be $pid\n"; kill (9,$pid); exit; } print "Going\n"; my $dir=dirname($0); chdir $dir; unshift (@ARGV,"./blastall"); $pid = fork; die "Can't fork: $!\n" unless defined $pid; if ($pid) { # Parent. Do whatever you want print "In parent.\n"; my $kid=0; do { waitpid ($pid,0); } until ($kid == -1); } else { # Child print "In child.\n"; exec (@ARGV) or die "Unable to exec: $!"; } print "After fork if.\n"; # this was used after `@ARGV` to get error message if executing failed # if ($?!=0) { # warn "@ARGV failed: ",$?,":",$?>>8,"\n"; # exit $?; # } print "Exiting.\n"; exit;
Re^2: How to get child pid from backtics
by Hena (Friar) on Dec 09, 2004 at 14:37 UTC
    I was kind of hoping that it would not involve fork :).

      In fact, you are anyway. Backticks does not avoid it, it only does hide it from you...


      --
      zejames