Ви можете виявити витік файлового дескриптора двома різними способами:
- Ви можете помітити багато IOExceptions із повідомленням «Забагато відкритих файлів».
- Під час навантажувального тестування ви періодично запускаєте сценарій профілювання, наприклад lsof (в UNIX), і помічаєте, що список дескрипторів файлів постійно збільшується.
У псевдофайловій системі /proc ми можемо знайти дескриптори відкритих файлів під /proc/<pid>/fd/ де <pid> – PID даного процесу. Таким чином, ми повинні визначити ідентифікаційний номер процесу (PID) процесу, щоб переглянути його дескриптори відкритого файлу.
Щоб визначити, чи пов’язаний fd з pipe/fifo, можна використовуйте системний виклик fstat()., яка повертає структуру, поле st_mode якої містить тип і дозволи файлу, відкритого на цьому fd. Стандартний макрос S_ISFIFO() C можна використовувати для цього поля st_mode, щоб визначити, чи є fd каналом/fifo.
Використовуйте команду ulimit -n щоб переглянути кількість файлових дескрипторів, налаштованих для вашої системи Linux. Якщо результат відображає значення 20000 або більше, це завдання завершено.
Прапори дескрипторів файлів є різні атрибути файлового дескриптора. Ці прапорці пов’язані з певними файловими дескрипторами, тому, якщо ви створили повторювані файлові дескриптори з одного відкриття файлу, кожен дескриптор матиме власний набір прапорців.
Поширені причини помилки
- Спроба використати дескриптор файлу після його закриття.
- Некоректна передача дескриптора файлу між процесами.
- Використання дескриптора файлу, який ніколи не відкривався та не ініціалізувався.