Although when using SystemV (Sunos 5.9) today, I had a complaint about a defunct process being left even after closing both the read and write channels - this being in a subroutine that handled repeated communications with a time-series database language interpreter. At some point there was one defunct process for each time I had called the subroutine. To fix this, I had to modify the code to specifically tell the parent to wait. It seems silly that I should have to do that, but on the other hand it is indeed partially documented in perlipc. Here is what I had to do to fix it, but applied to the above piece of code instead of mine:
use IPC::Open2;
use POSIX ":sys_wait_h";
my $pid = open2 ( REA, WRI, 'tr a-z A-Z' ) or die $!;
for (<DATA>){
print {\*WRI} [(my $cmd, my @rest) = split]->[0];
}
close WRI;
print <REA>;
close REA; # but believe it or not, under sysV the zombie is still the
+re!
waitpid($pid,0); # this will finally kill it cleanly!
__END__ # although exit from the program will eventually kill it of co
+urse
an apple a day
boat for bloat
| [reply] [d/l] |