Добавляя ко всем другим, очень полезным ответам, я хотел сделать доступной следующую информацию, надеясь, что она будет полезна для других, в духе базы знаний.
Дело в том, что если мы предполагаем систему, совместимую с POSIX, http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_14,, то это указывает следующее (выделение мое):
Все функции, открывающие один или несколько файловых дескрипторов, должны, если не указано иное, атомарно назначать дескриптор файла с наименьшим номером (то есть, который еще не открыт в вызывающем процессе) на момент каждого выделения , Если одна функция выделяет два файловых дескриптора (например, pipe()
или socketpair()
), выделения могут быть независимыми, и поэтому приложения не должны ожидать, что они будут иметь смежные значения или зависеть от того, какое из них имеет более высокое значение.
Это позволяет программе просто зарезервировать массив до количества дескрипторов, которые она хочет поддерживать, при этом открытый дескриптор может быть просто использован как подстрочный индекс массива для ссылки на что-то вроде данных, связанных с подключением клиента. По сути, дескриптор открытого файла в таких системах может быть непосредственно использован в качестве индекса в таблице, которая реализована в виде массива. В конце концов, номера файловых дескрипторов будут не только расти вверх по сравнению с наименьшими доступными значениями, но также, похоже, будут использоваться повторно - если вы закроете дескриптор 10, пока у вас все еще открыты дескрипторы 11 и более, при следующем открытии дескриптора, POSIX- совместимая система откроет описание с индексом 10. Это также делает очень простым повторное использование строк в вашей индексированной таблице fd.