Как получить открытые файлы подпроцесса?
Как получить открытые файлы подпроцесса?
я открыл подпроцесс, который генерирует файлы, я хочу получить дескриптор файла этих файлов, чтобы сделать 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