Как получить открытые файлы подпроцесса?

Как получить открытые файлы подпроцесса?

я открыл подпроцесс, который генерирует файлы, я хочу получить дескриптор файла этих файлов, чтобы сделать fsync на них

так что если у меня есть такой код:

p = subprocess.Popen([
            'some_program'
])

процесс p генерирует несколько файлов, я могу получить идентификатор процесса подпроцесса, используя:

p.pid

но как я могу получить fd из этих файлов для вызова flush и fsync() на них?

на самом деле я нахожу утилиту под названием "lsof" (список открытых файлов), но она не установлена ​​и не поддерживается в моей системе, поэтому я не проводил дальнейших исследований по ней, так как мне действительно нужен стандартный способ

Спасибо

3 ответа

Решение

Каждый процесс имеет свою собственную таблицу файловых дескрипторов. Если вы знаете, что у дочернего процесса есть определенный файл, открытый с помощью FD 8 (что достаточно просто, просто возьмите список /proc/<pid>/fd), когда вы делаете fsync(8) Вы синхронизируете файл своего процесса, а не ребенка.

То же самое относится ко всем функциям, которые используют файловые дескрипторы: fread, fwrite, dup, close...

Чтобы получить эффект fsyncВы можете позвонить sync вместо.

Вместо этого вы могли бы реализовать некий механизм RPC. Например, вы можете добавить обработчик сигнала, который заставляет ребенка работать fsync на всех открытых FD, когда он получает SIGUSR1.

Вы не можете fsync от имени другого процесса. Кроме того, вы, вероятно, хотите сброс, а не fsync. Вы также не можете выполнить очистку от имени другого процесса. Переосмыслите свои требования.

Если вы хотите использовать упакованное решение, вместо того, чтобы идти в /proc/pid/fd, вы можете использовать lsof из psutils

Другие вопросы по тегам