On 05/19/2015 05:59 AM, Skip Montanaro wrote:

Due to presumed bugs in an underlying library over which I have no control, I'm 
considering a restart in the wee hours of the morning. The basic fork/exec 
dance is not a problem, but how do I discover
all the open file descriptors in the new child process to make sure they get 
closed? Do I simply start at fd 3 and call os.close() on everything up to some 
largish fd number? Some of these file
descriptors will have been opened by stuff well below the Python level, so I 
don't know them a priori.

Pandaemonium [1] (and I believe Ben Finney's daemon [2]) use something akin to 
the following:

def close_open_files(exclude):
    max_files = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
    keep = set()
    for file in exclude:
        if isinstance(file, baseint):
            keep.add(file)
        elif hasattr(file, 'fileno'):
            keep.add(file.fileno())
        else:
            raise ValueError(
                    'files to not close should be either an file descriptor, '
                    'or a file-type object, not %r (%s)' % (type(file), file))
    for fd in range(max_files, -1, -1):
        if fd in keep:
            continue
        try:
            os.close(fd)
        except OSError:
            exc = sys.exc_info()[1]
            if exc.errno == errno.EBADF:
                continue
            raise

So, yeah, basically a brute-force method.

--
~Ethan~


[1] https://pypi.python.org/pypi/pandaemonium
[2] https://pypi.python.org/pypi/python-daemon
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to