Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

•Re: open file descriptors

by merlyn (Sage)
on Dec 13, 2003 at 16:13 UTC ( #314533=note: print w/replies, xml ) Need Help??

in reply to open file descriptors

This'll give you a list of filehandle objects open for read on the current file descriptors that are also open:
use FileHandle; my @handles = map FileHandle->new_from_fd($_, "r"), 0..100;
Handles that aren't open come back as undef in this array. So $handles[0] is STDIN, etc.

If you don't need the mapping from specific fd, then add grep defined($_), in front of the map.

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Replies are listed 'Best First'.
Re: •Re: open file descriptors
by etcshadow (Priest) on Dec 13, 2003 at 21:37 UTC
    Well, that has the builtin assumption that the max fileno is 100, which is probably good enough, usually, but it will lead to a really hard to debug problem, eventually. It's actually somewhat of a weakness of perl, I think, that there is no exposed system call to get all open file descriptors. Obvoiously you can deal with this if you compile perl properly, and just refer to the system call by number through syscall()... but still, this is sad.

    This is additionally sad because of the behavior of perl's output buffers on fork() (leaving buffers unflushed), since the buffers are duped with the fork, but there is no means by which to systematically flush all buffers before fork(). However, as I understand it, the behavior on fork() is fixed in later versions of perl (I'm still on 5.005_03... but we're working on an upgrade plan to 5.8 soon)... so that's good at least.

    Not an editor command: Wq
      Having something, a system call, that could count all open file handles would be in the same class of functions like flock: only compatable to a point. I've never heard of a function in unix to do that, but I know that procfs hints you in on what's going on w/ a process.

      Play that funky music white boy..
        Yeah, you're right... it's not a system call issue (with the flush on fork), but an issue with the fact that perl doesn't have a fflush() builtin which emulates the fflush() in unix... that is: having the ability to flush all fd's (not just individual named fd's).

        Anyway, because I remembered that issue wrong, I made the incorrect leap that there must be an unimplemented-in-perl system call to get all open fd's.

        Anyway, my bad. Thanks. Still, it seems like there ought to be a faster way to find all open fd's than iterating through all *possible* fileno's looking for ones that are open fd's. Oh, well.

        Not an editor command: Wq
Re^2: open file descriptors
by jeremyh (Beadle) on Sep 15, 2004 at 19:39 UTC
    A very belated thanks to merlyn!

    This code has helped my in a fairly large project.
    This was my first post and didn't really know how the site worked at the time, so didn't mention how much this helped me out.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://314533]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (5)
As of 2018-04-20 09:09 GMT
Find Nodes?
    Voting Booth?