Закрытие всех открытых файлов в процессе

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

Это полезно знать после fork() (до exec()).

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

Ответ 1

Существующие механизмы специфичны для платформы. См. этот ответ

Ответ 2

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

Ответ 3

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

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