Получение количества текущих файловых дескрипторов из кода C
Есть ли API-интерфейс C, чтобы получить:
- Существующие используемые файловые дескрипторы системы
- Текущие используемые файловые дескрипторы текущего процесса
Ответы
Ответ 1
Для текущего счетчика процессов вы можете использовать getrlimit
, чтобы получить ограничение на дескриптор файла, затем перебрать все целые числа от 0 до этого предела и попробовать позвонить fcntl
с помощью команды F_GETFD
. Это будет успешным только в файловых дескрипторах, которые фактически открыты, позволяя вам посчитать их.
Изменить: Теперь у меня есть лучший способ сделать это. После получения rlimit
создайте большой массив struct pollfd
(насколько это возможно, если это возможно, в противном случае вы можете разбить его на несколько прогонов/вызовов) с каждым fd в диапазоне и членом events
, установленным на 0. Вызовите poll
в массиве с 0 таймаутом и найдите флаг POLLNVAL
в revents
для каждого члена. Это скажет вам, какие из потенциально огромного набора fds недействительны с помощью одного syscall, а не с одним syscall на fd.
Ответ 2
Поскольку вы говорите, что находитесь в Linux, вы можете открыть папку /proc/self/fd/
, которая должна содержать символические ссылки на все дескрипторы открытых файлов.
Ответ 3
Вы можете прочитать /proc/sys/fs/file-nr
, чтобы найти общее количество выделенных и свободных дескрипторов файловой системы, а также максимально допустимое.
[[email protected] proc]# cat /proc/sys/fs/file-nr
3853 908 53182
| | |
| | |
| | max: maximum open file descriptors
| free: total free allocated file descriptors
allocated: total allocated file descriptors since boot
Чтобы вычислить число, которое в настоящее время используется, просто allocated - free
. Вы также можете рассчитать процент используемых дескрипторов, выполнив ((allocated - free) / max) * 100
Что касается каждого процесса, я не уверен в программном способе, которым вы можете это сделать.
Вот учебник о том, как это сделать с lsof
в любом случае: http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
Ответ 4
Я не уверен в дескрипторах файлов, но вы можете легко проверить файлы <stdio.h>
.
В stdio.h
, __sF
- массив файлов, в котором хранится каждый FILE
. (googling __sF
показывает много stdio
с соответствующим ключевым словом).
Если флаги FILE
пустые, файл не используется. Поэтому мы можем просто пройти через __sF
, проверив флаг каждого FILE
в массиве.
#include <stdio.h>
int getOpenFileCount(void)
{
int fileCount;
for (fileCount = 0; __sF[fileCount]._flags != 0; fileCount++)
continue;
return fileCount;
}