Article 9028 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:9028
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.utdallas.edu!corpgate!bnrgate!bnr.co.uk!uknet!pipex!howland.reston.ans.net!agate!boulder!wraeththu.cs.colorado.edu!tchrist
From: Tom Christiansen <tchrist@cs.Colorado.EDU>
Subject: Re: How to close an unknown descriptor from a perl script
Message-ID: <CIAJsE.9vK@Colorado.EDU>
Originator: tchrist@wraeththu.cs.colorado.edu
Sender: news@Colorado.EDU (USENET News System)
Reply-To: tchrist@cs.colorado.edu (Tom Christiansen)
Organization: University of Colorado, Boulder
References: <2eq9go$ldc@info.epfl.ch>
Date: Sun, 19 Dec 1993 16:43:25 GMT
Lines: 34

:-> In comp.lang.perl, brossard@sic.epfl.ch writes:
:    I figure the only way this could be happening is if a descriptor
:to the client is inadvertently kept open by httpd and passed to the
:perl script.  So how can the perl script guarantee that it has closed
:ALL descriptors.  A C program could just call close on descriptors
:0 to n where n is big enough and ignore all errors on non-opened
:descriptors.

Probably the easiest way is

    require 'syscall.ph';
    for ($fd = 3; $fd < 200; $fd++) {
	syscall(&SYS_close, $fd);
    } 

But if your C library doesn't support syscall(), you'll have to do it
differently.  I'll assume that you aren't putting file handles into 
other packages:

    foreach $symname ( keys %_main ) {
	next unless defined fileno($symname);
	next if $symname =~ /^STD(IN|OUT|ERR)$/;
	close($symname);
    } 

You might also look into $^F.

--tom


-- 
    Tom Christiansen      tchrist@cs.colorado.edu       
      "Will Hack Perl for Fine Food and Fun"
	Boulder Colorado  303-444-3212


