Причина , почему сокетов TCP / IP дескрипторы использование файлов является то , что, когда интерфейс сокетов был первым разработан и реализован ( в BSD Unix, в 1983 году ), его создатели считали , что сетевое соединение было аналогично файлу - вы можете read
, write
и close
как и что это хорошо согласуется с идеей Unix «все - файл».
Другие реализации сетевого стека TCP / IP не обязательно интегрировались с подсистемой файлового ввода-вывода их операционной системы, примером является MacTCP . Но поскольку интерфейс сокетов BSD был очень популярен, даже эти другие реализации решили реплицировать API сокетов с его Unix-подобными функциями, поэтому вы получили «файловые дескрипторы», используемые только для связи по протоколу TCP / IP, в системах, которые иначе не использовали есть файловые дескрипторы.
Другая часть вашего вопроса - почему существует ограничение? Это потому, что самый быстрый способ реализовать таблицу поиска файловых дескрипторов - использовать массив. Исторически, предел был жестко запрограммирован в ядре.
Вот код в Unix выпуск 7 (1979) с жестко заданным ограничением 20 файловых дескрипторов на процесс:
Для сравнения, Linux динамически распределяет пространство для таблицы дескрипторов файлов процесса. Абсолютный предел по умолчанию равен 8192, но вы можете установить его так, как вам нравится. Моя система списков 191072 в /proc/sys/fs/file-max
.
Несмотря на то, что в Linux больше нет абсолютных ограничений, тем не менее, мы не хотим, чтобы программы сходили с ума, поэтому администратор (или дистрибутив дистрибутива) обычно устанавливает ограничения ресурсов. Взгляни /etc/security/limits.conf
или беги ulimit -n
.