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は整数です。これはファイル記述子ではありません。名前と混同して申し訳ありませんが、コードは一目瞭然です。

EDIT2

私はこれについて怒り狂っています、私fdはファイル番号を意味することを選択したためだと思います。ドキュメントを確認しました:

このモジュールのすべての関数は、最初の引数としてファイル記述子fdを取ります。これは、sys.stdin.fileno()によって返されるような整数のファイル記述子、または本物のファイル記述子を返すfileno()を提供するsys.stdin自体などのファイルオブジェクトにすることができます。

確か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 に答える