Каковы возможные значения для файловых дескрипторов?
мне интересно узнать допустимые значения, которые я могу ожидать для файлового дескриптора.
Пожалуйста, позвольте мне объяснить немного. Я знаю это, например, когда использую #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).
когда возвращается отрицательное значение файлового дескриптора, это означает, что произошла ошибка.