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

nneul has asked for the wisdom of the Perl Monks concerning the following question:

I need to be able to fork() in an unknown context where various file handles are likely to be open, including db connections. I've tried the approach of the using the fdopen functionality and closing it for 1..1024 or so, but I didn't figure that would work (and doesn't), since it just opens and closes a new filehandle. The underlying fd still is open afterwards.
#!/usr/bin/perl $| = 1; open(OUT, ">foo"); &CloseAllOpenFiles(); print "done with close.\n"; sleep 20; # go look at process with lsof to see if fd still open sub CloseAllOpenFiles { local *F; for (my $fd=0; $fd<=1024; $fd++) { open F, "<&=$fd" or warn "Cannot reopen fd=$fd: $!"; close F; } }
I saw an approach with pulling in the posix module and using one of it's routines, but I hate to bring in all of POSIX just to close an fd. Is there any reasonable way to do this? Note, I am not planning on issuing an exec(), so the $^F approach won't work.