Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

закрыть(2);open("/dev/null", O_WRONLY);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top