my $job_id = new_job_id();
$SIG{ CHLD } = 'IGNORE';
die "fork failed: $!" unless defined( my $pid = fork );
if ( $pid ) {
# the parent branch (process P)
print_response( $job_id );
}
else {
# the child branch (process C)
# NEED: close_all_dups_to_stdout_and_stderr();
close STDOUT;
close STDERR;
compute_and_cache_results( $job_id );
}
exit;
####
open (ERROR, ">&STDERR");
printf STDERR "fileno( STDERR ): %d\n", fileno( STDERR );
printf STDERR "fileno( ERROR ): %d\n", fileno( ERROR );
##
##
fileno( STDERR ): 2
fileno( ERROR ): 6
##
##
use Parse::RecDescent;
close_all_fds();
sub close_all_fds {
my @lsof = `/usr/bin/lsof -p $$ 2>/dev/null`;
for my $line ( @lsof ) {
my @flds = split ' ', $line;
next unless $flds[ 3 ] =~ /^(\d+)/;
my $fd = $1;
my $fh;
unless ( open $fh, '<&=', $fd ) {
print "no luck with $line";
next;
}
# per recommendation of The Perl Cookbook, 2nd Ed, p. 262
print "closing $fd\n";
close $fh or die $!;
}
print Parse::RecDescent::ERROR "Nya, nya! I'm still open!\n";
}
__END__
output:
closing 0
closing 1
closing 2
closing 4
closing 5
closing 6
no luck with lsoftest 14113 yt 7r FIFO 0,6 89181771 pipe
Nya, nya! I'm still open!