假设我有一个已打开文件的列表(实际上是文件编号):
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是一个整数。 NOT 是一个文件描述符。很抱歉让您对该名称感到困惑,但代码不言自明。
我对此感到愤怒,我认为是因为我选择了fd
来表示文件编号。我刚检查了documentation:
此模块中的所有函数都将文件描述符fd作为它们的第一个 论点。这可以是整数文件描述符,例如返回的 sys.stdin.fileno(),或者文件对象,例如sys.stdin本身 提供了一个fileno(),它返回一个真正的文件描述符。
所以fd
确实是一个整数。它也可以是文件对象,但在一般情况下,fd
没有.name
。
答案 0 :(得分:6)
根据this answer:
for fd in get_open_fds():
print fd, os.readlink('/proc/self/fd/%d' % fd)
答案 1 :(得分: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')]