Закрытие всех открытых файлов в процессе - PullRequest
17 голосов
/ 22 августа 2009

Как мне найти все открытые файлы в процессе (изнутри себя)?

Это кажется полезным знать после fork() (до exec()).

Я знаю о существовании getdtablesize() и более переносимом sysconf(_SC_OPEN_MAX), но кажется неэффективным пытаться закрыть каждый действительный дескриптор файла, независимо от того, есть ли за ним открытый файл или нет. (Я также знаю об опасностях преждевременной оптимизации, это больше об эстетике, я думаю: -)

Ответы [ 4 ]

8 голосов
/ 30 июня 2011

Если ваша программа будет вызывать fork и exec, вам действительно следует открыть все файловые дескрипторы с флагом O_CLOEXEC, чтобы вам не приходилось закрывать их вручную до exec. Вы также можете использовать fcntl для добавления этого флага после открытия файла, но это зависит от условий гонки в многопоточных программах.

5 голосов
/ 22 августа 2009

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

Если вы хотите найти только закрытые дескрипторы открытых файлов, вы можете использовать файловую систему proc в тех системах, где она существует. Например. в Linux / proc / self / fd перечислит все дескрипторы открытых файлов. Выполните итерацию по этому каталогу и закройте все> 2, за исключением дескриптора файла, который обозначает каталог, по которому вы перебираете.

2 голосов
/ 05 ноября 2018

Потратив много часов на поиск ошибки, да, закрытие всех файловых дескрипторов может вызвать проблемы.

Вопрос в том, сколько существует файловых дескрипторов?

1024 раньше был очень распространенным, и 1024 - это не совсем необоснованное количество файловых дескрипторов, которые нужно закрывать. Поскольку большинство из них закрыты, это просто проверка байта в памяти.

Моя операционная система поставляется с значением по умолчанию 1 048 576. На этом (предположительно медленном) сервере, очевидно, может потребоваться более 4,7 микросекунд, чтобы попытаться закрыть дескриптор файла. Это привело к таймауту (5 секунд). И невозможно сказать, насколько высоко будет расти число. По крайней мере, установите (разумный) верхний предел.

/ proc / self / fd не идеален, но такие ошибки очень сложно найти.

1 голос
/ 31 августа 2018

В системах, которые его поддерживают (что в основном означает любой Unix, кроме Linux), существует системный вызов closefrom (2), разработанный специально для этой цели.

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