Каковы возможные значения для файловых дескрипторов?

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

Пожалуйста, позвольте мне объяснить немного. Я знаю это, например, когда использую #include <unistd.h> в моей системе linux затем вызов, чтобы открыть файл для чтения:

int fileDescriptor;
fileDescriptor = open("/some/filename",O_RDONLY);

может возникнуть ошибка, и в результате я получаю -1.
Кстати тег (-1) отрицательный должно быть, имеет какое-то особое значение. Является ли все остальные значения допустимыми файловыми дескрипторами? т. е. отрицательных вроде -2 и -1023?

предполагая, что int равен 4 байтам (sizeof(int)==4), затем

(-1) = 10000000 0000000 00000000 00000001

будет единственным обнаруживаемым недопустимым дескриптором файла? Хотели бы другие:

  • (0) = 00000000 0000000 00000000 00000000
  • (-2) = 10000000 0000000 00000000 00000010
  • (2) = 00000000 0000000 00000000 00000010

все в порядке? Поскольку файловый дескриптор может хранить 4 байта, я мог бы иметь максимум (2^(8*4)-1) допустимые файловые дескрипторы и, следовательно, максимальное число из файлов, которые я могу открыть, правильно?

чтобы снова выразиться ясно:

что я должен ожидать от (допустимого) файлового дескриптора?

любое значение -1?

4 ответов


С man page:

open() возвращает файловый дескриптор небольшое неотрицательное целое число.

и затем:

open() и creat() возвращает новый дескриптор файла, или -1, если произошла ошибка


, когда open выполнена, то возвращается -1 или 0xffffffff. Это не имеет никакого значения, но open ошибка:

по успешному завершению, функция раскроет файл и возвращает неотрицательное целое число, представляющее наименьший неиспользуемый номер файловый дескриптор. В противном случае, возвращается -1 и errno устанавливается в укажите ошибку. Файлы не должны создаваться или изменяться, если функция возвращает -1.

причина отказа хранится в errno, вы можете прочитать его значение и проверить, является ли это одной из возможных причин сбоев EACCES, EEXIST, EINTR.. etc, или просто используйте perror для печати сообщения об ошибке.


вот что такое Linux страница руководства говорит:

open() и creat() возвращает новый дескриптор файла, или -1 Если произошла ошибка (в этом случае, errno правильно задан).

другие системы могут возвращать другие отрицательные значения в случае ошибки.


диапазон возможных значений файловых дескрипторов составляет от 0 до 1023 для системы Linux (32-разрядная или 64-разрядная система).

нельзя создать файловый дескриптор со значением больше 1023. В случае файлового дескриптора со значением 1024 он вернет ошибку EBADF (bad file descriptor, error no-9).

когда возвращается отрицательное значение файлового дескриптора, это означает, что произошла ошибка.