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;
|