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