Как программно найти все файловые дескрипторы процесса? - PullRequest
0 голосов
/ 20 марта 2010

У меня есть процесс "x", который использует "системную" функцию C для запуска демона ntpd. Я заметил, что ntpd передаются дескрипторы открытого файла "x". ntpd сохраняет дескрипторы файлов даже после удаления исходного файла. например: через некоторое время некоторые файлы журналов, используемые «x», будут развернуты, но «ntpd» имеет дескриптор файла, открытый для этих удаленных файлов. Это вызовет какие-либо проблемы?

В качестве альтернативы я подумал об установке флага "FD_CLOEXEC" для всех файловых дескрипторов перед вызовом "системной" функции. Но поскольку мы работаем как библиотека расширения для третьего процесса «x» («x» загружает нашу библиотеку на основании некоторого условия), нет простого способа узнать обо всех открытых файловых дескрипторах процесса. Один из способов - прочитать / proc // fd и установить «FD_CLOEXEC» для каждого дескриптора файла и сбросить его обратно после возврата из функции «system». Я использую Linux 2.6.16. Есть ли другой простой способ найти все обработчики файлов?

Спасибо

1 Ответ

3 голосов
/ 20 марта 2010

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

В идеале вы должны убедиться, что FD_CLOEXEC установлен во всех файловых дескрипторах; с POSIX 2008 вы можете сделать это, когда файл открывается даже с флагом O_CLOEXEC. Но если вы являетесь частью другого процесса и не отвечаете за его код, тогда это совсем не просто. Ваш выбор - грубая сила и невежество. Вы можете перебирать все дескрипторы, которые, по вашему мнению, могут быть открыты, и закрывать их, игнорируя ошибки дескрипторов, которые уже закрыты. Это грубая сила. Или вы можете игнорировать файлы, которые открыты, и надеяться, что система не слишком сильно застревает. Возможно, вы можете ограничить свой поиск, проверив, сколько файлов вы можете открыть одновременно.

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