Получение количества текущих используемых файловых дескрипторов из кода C - PullRequest
16 голосов
/ 02 ноября 2011

Есть ли C API для получения:

  1. Текущие используемые дескрипторы файлов в масштабе всей системы
  2. Текущие используемые файловые дескрипторы текущего процесса

Ответы [ 4 ]

18 голосов
/ 02 ноября 2011

Для текущего числа процессов вы можете использовать getrlimit, чтобы получить предел дескриптора файла, затем выполнить итерацию по всем целым числам от 0 до этого предела и попытаться вызвать fcntl с помощью команды F_GETFD.Он будет успешным только на тех дескрипторах файлов, которые действительно открыты, что позволяет вам считать их.

Редактировать: Теперь у меня есть лучший способ сделать это.После получения rlimit создайте большой массив struct pollfd (по возможности, максимально допустимый; в противном случае вы можете разбить его на несколько запусков / вызовов), когда каждый fd находится в диапазоне, а элемент events установлен в0. Вызвать poll для массива с таймаутом 0 и найти флаг POLLNVAL в revents для каждого члена.Это скажет вам, какие из потенциально огромных наборов fds недопустимы с одним системным вызовом, а не с одним системным вызовом на fd.

13 голосов
/ 02 ноября 2011

Поскольку вы говорите, что используете Linux, вы можете открыть папку /proc/self/fd/, которая должна содержать символические ссылки на все открытые файловые дескрипторы .

12 голосов
/ 02 ноября 2011

Вы можете прочитать /proc/sys/fs/file-nr, чтобы найти общее количество выделенных и свободных дескрипторов файловой системы, а также максимально допустимое значение.

[root@box 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

0 голосов
/ 06 марта 2017

Я не уверен в файловых дескрипторах , но вы можете легко проверить <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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...