Причина , чому сокетов 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
.