I recently had to do something similar, and stumbled into a rats nest of problems revolving around SIGSTOP, and process groups.
In my scenario, I had a perl script starting up and managing a unix process on a Sun workstation. Anytime I hit ctl-z at my shell prompt (the shell that started the perl script), both the perl script and the background unix process stopped. This is not what I wanted at all.
After much gnashing of teeth and tearing out hair (I should have asked here), I finally figured out that the SIGSTOP was being sent to everyone in my process group. To solve the problem, I needed to create the unix process in its own process group. This is how I learned about the wonders of the perl "setpgrp" command, and process groups in general.
So here is my code:
# Fork a unix process...
my $pid;
if($pid = fork) {
print STDERR "parent pid=$$ child pid=$pid\n";
}elsif (defined $pid) {
print STDERR "child pid=$$ pid=$pid\n";
# Must do setpgrp as child for nohup and job control stuff...
setpgrp(0, $$);
exec $unixcmd || die "Bad exec $!";
}
kill 'INT', $pid;
Hope that helps.
-Craig
UPDATE:
oha opened my mind, by letting me know that the setpgrp could be done from either the parent or the child process. oha++ Thanks! |