Получение количества текущих файловых дескрипторов из кода 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;
}