Назначение дескриптора файла в C - PullRequest
4 голосов
/ 09 сентября 2008

Когда создаются сокеты или файлы открываются / создаются в C, гарантированно ли дескриптор файла, который назначен сокету / файлу, является дескриптором с самым низким значением? Что спецификация C говорит о назначении дескриптора файла в этом отношении, если что?

Ответы [ 6 ]

5 голосов
/ 09 сентября 2008

Это не гарантируется быть самым низким, и зависит от реализации (1) . Однако в общем случае подпрограмма, назначающая дескрипторы открытого файла, использует метод, который дает вам первое открытое включение. Вполне возможно, что сразу после освобождения нескольких более низких дескрипторов вы получите более высокий дескриптор, чем вы могли бы ожидать.

Однако единственная причина, по которой я могу это знать, - это функция select, которая ускоряется, если вы передаете ей самый высокий дескриптор файла, который вы должны проверить.

(1) Обратите внимание, что те реализации, которые следуют стандарту IEEE, гарантируют самый низкий неиспользуемый дескриптор для файлов, но это может не относиться к сокетам. Не каждая реализация соответствует стандарту IEEE для open (), поэтому, если вы пишете переносимое программное обеспечение, лучше не зависеть от него.

4 голосов
/ 09 сентября 2008

Я не думаю, что вы найдете это в спецификации C, скорее, спецификации для вашей ОС. Мой опыт работы с Linux всегда был самым низким.

2 голосов
/ 09 сентября 2008

Я отвечу на это другим вопросом - почему это имеет значение? Вы не должны сравнивать файловый дескриптор с чем-либо (если только вы не проверяете на наличие stdin / stdout / stderr) или делать с ним математические вычисления Пока он вписывается в int (и гарантирует), это все, что вам действительно нужно знать.

0 голосов
/ 27 февраля 2009

Спецификация C говорит, что это зависит от реализации. Если вы смотрите на реализацию Unix, на странице руководства open (2) говорится: «Дескриптор файла, возвращаемый при успешном вызове, будет дескриптором файла с наименьшим номером, который в данный момент не открыт для процесса».

Это помогает, если вы пытаетесь прикрепить определенный файл к определенному дескриптору. Скажем, вы хотите перенаправить stderr в / dev / null. Что-то вроде

близко (2); open ("/ dev / null", O_WRONLY);

должен это сделать. Вы, конечно, должны захватить fd, возвращенный open, и убедиться, что он равен 2.

0 голосов
/ 09 сентября 2008

@ aib open (), close (), lseek (), read (), write () - все используют файловые дескрипторы. Я почти никогда не использую потоки для ввода / вывода.

@ Кайл, это важно из-за операторов типа select (). Знание самого высокого дескриптора может улучшить производительность.

0 голосов
/ 09 сентября 2008

Стив М прав; C не имеет понятия о сокетах, и его функции файлового ввода / вывода используют [указатель на] объект FILE, а не дескриптор.

...