Обновить дескриптор файла, указывающий на / proc / self после fork () из python multiprocess.Process - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над программой на C ++, которая использует boost :: python для предоставления python оболочки / API для пользователя. Программа отслеживает и ограничивает использование собственной памяти, открывая / proc / self / statm с помощью файлового дескриптора. При каждом временном шаге он ищет начало этого файла и считывает из него vmsize.

proc_self_statm_fd = open( "/proc/self/statm", O_RDONLY );

Однако это вызывает проблему при вызове fork (). В частности, когда пользователь пишет сценарий python, который выполняет что-то вроде этого:

proc = multiprocessing.Process(name="bkg_process",target=bkg_process,daemon=True)

Проблема заключается в том, что разветвленный процесс получает дескриптор файла, указывающий на / proc / self / statm из родительского процесса, а не его собственного, и это сообщает о неправильном использовании памяти. Еще хуже, если родительский процесс завершается, дочерний процесс завершается ошибкой при попытке чтения из дескриптора файла.

Какое правильное решение для этого? Это нужно обрабатывать на уровне C ++, потому что мы не можем контролировать пользовательские сценарии python. Есть ли способ, чтобы класс автоматически обнаружил, что произошла форк, и получил новый дескриптор файла? В худшем случае я могу заново открыть файл для каждого обновления. Я боюсь, что это добавит время выполнения, хотя.

1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете сохранить PID в классе и сравнить его со значением getpid() при каждом вызове, а затем повторно открыть файл, если PID изменился. getpid() обычно намного дешевле, чем open - в некоторых системах даже не требуется переключение контекста (он просто выбирает PID из магического c местоположения в собственной памяти процесса).

Тем не менее, вы также можете измерить стоимость повторного открытия файла каждый раз - это может на самом деле не быть значительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...