Согласно документации ядра , /proc/sys/file-max
это максимальное, общее, глобальное количество файловых дескрипторов, которое ядро выделит перед запуском. Это ограничение ядра, а не вашего текущего пользователя. Таким образом, вы можете открыть 590432 при условии, что вы один в режиме ожидания (однопользовательский режим, демоны не запущены).
Обратите внимание, что документация устарела: файл был proc/sys/fs/file-max
в течение длительного времени. Спасибо Martin Jambon за указание на это.
О разнице между мягкими и жесткими пределами можно узнать здесь, на SE . Вы можете повышать или понижать мягкое ограничение как обычный пользователь, при условии, что вы не превышаете жесткое ограничение. Вы также можете снизить жесткий лимит (но вы не можете повысить его снова для этого процесса). Как суперпользователь, вы можете поднимать и опускать как жесткие, так и мягкие ограничения. Схема двойного ограничения используется для обеспечения соблюдения системных политик, но также позволяет обычным пользователям устанавливать временные ограничения для себя, а затем изменять их.
Обратите внимание, что если вы попытаетесь снизить жесткий предел ниже мягкого (и вы не являетесь суперпользователем), вы EINVAL
вернетесь (неверный аргумент).
Итак, в вашем конкретном случае ulimit
(что совпадает с ulimit -Sf
) говорится, что у вас нет мягкого ограничения на размер файлов, записываемых оболочкой и ее подпроцессами . (это, вероятно, хорошая идея в большинстве случаев)
Ваш другой вызов ulimit -Hn
сообщает об -n
ограничении (максимальное количество дескрипторов открытых файлов), а не об -f
ограничении, поэтому мягкий предел кажется выше жесткого ограничения. Если вы войдете, ulimit -Hf
вы также получите «безлимитный».
/proc/sys/fs/file-max
.ulimit -Hn
предназначено для самого ограничения системы на выделенные возможности дескриптора файла?ulimit
влияет только на ограничения для текущего процесса . Пределы текущего процесса также передаются дочерним процессам, но каждый процесс имеет отдельный счет. Напримерulimit -Hn 10
, вы можете одновременно открыть только 10 файловых дескрипторов. Каждый дочерний процесс, который вы создаете, может иметь до 10 файловых дескрипторов. Только суперпользователь может увеличить лимит после установки. Если вы установите слишком низкое значение, единственным вариантом может быть уничтожение процесса оболочки и запуск нового.Системный вызов «select» - это одно из многих ужасных решений Unix, которые заставляют задуматься о том, что даже Windows95 по-прежнему выглядит так хорошо в сравнении.
Он должен был быть забанен 20 лет назад, и тогда у нас теперь может быть возможность без ограничений обрабатывать файлы без ограничений.
Вы можете легко увеличить количество файловых дескрипторов с помощью конфигурации ядра и ulimit, НО помните, что если какая-либо библиотека использует системный вызов «select», ваша программа станет нестабильной (повреждение памяти) и завершится ошибкой.
Select может обрабатывать только файловые дескрипторы от 0 до 1023, и если вы передадите один из них с более высоким значением, он будет случайно вставляться в вашу память, и выборка никогда не повторит дескриптор как работающий. К сожалению, многие библиотеки используют select.
источник
fd_set(3)
справочной страницы и узнать, откуда исходит ограничениеFD_SETSIZE
. И лучшим было бы предложение о замене вызова, какpoll(3)
, как в этом ответе