7

假设我有一个打开文件的列表(实际上是文件编号):

import resource
import fcntl

def get_open_fds():
    fds = []
    soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
    for fd in range(3, soft):
        try:
            flags = fcntl.fcntl(fd, fcntl.F_GETFD)
        except IOError:
            continue
        fds.append(fd)
    return fds

现在我想获取这些文件的名称。我怎样才能做到这一点?

编辑

只是为了澄清,对于那些反对这一点的人:fd 是一个整数。它不是文件描述符。很抱歉让您与名称混淆,但代码是不言自明的。

编辑2

我对此感到愤怒,我认为是因为我选择了fd表示文件号。我刚刚检查了文档

该模块中的所有函数都将文件描述符 fd 作为其第一个参数。这可以是一个整数文件描述符,例如由 sys.stdin.fileno() 返回,也可以是一个文件对象,例如 sys.stdin 本身,它提供了一个返回真正文件描述符的 fileno()。

所以fd确实是一个整数。它也可以是一个文件对象,但在一般情况下,fd它不是.name.

4

2 回答 2

6

根据这个答案

for fd in get_open_fds():
    print fd, os.readlink('/proc/self/fd/%d' % fd)
于 2012-11-29T10:39:40.343 回答
2

我在同一条船上。我最终做的是编写我自己的open来跟踪所有打开的文件。然后在最初的 Python 文件中,首先发生的事情是内置的open被我的替换,然后我可以查询它以获取当前打开的文件。这是它的样子:

class Open(object):
    builtin_open = open
    _cache = {}
    @classmethod
    def __call__(cls, name, *args):
        file = cls.builtin_open(name, *args)
        cls._cache[name] = file
        return file
    @classmethod
    def active(cls, name):
        cls.open_files()
        try:
            return cls._cache[name]
        except KeyError:
            raise ValueError('%s has been closed' % name)
    @classmethod
    def open_files(cls):
        closed = []
        for name, file in cls._cache.items():
            if file.closed:
                closed.append(name)
        for name in closed:
            cls._cache.pop(name)
        return cls._cache.items()

import __builtin__
__builtin__.open = Open()

然后后来...

daemon.files_preserve = [open.active('/dev/urandom')]
于 2014-04-16T22:30:57.657 回答