问题
I am interested to know the valid values which I can expect for a file descriptor.
Please let me explain a bit. I know that, for instance, when I use #include <unistd.h>
on my linux system then a call to open a file for reading:
int fileDescriptor;
fileDescriptor = open("/some/filename",O_RDONLY);
an error might occur and I receive -1 as a result.
Incidently the (-1) negative one must have somewhat of a special meaning. Is it that all other values are valid file descriptors? i.e. also negative ones like -2 and -1023?
Assuming that int is 4 bytes (sizeof(int)==4
), then would
(-1) = 10000000 0000000 00000000 00000001
would be the only detectable invalid file descriptor? Would others like:
(0) = 00000000 0000000 00000000 00000000
(-2) = 10000000 0000000 00000000 00000010
(2) = 00000000 0000000 00000000 00000010
be ok? Since the file descriptor could store 4 bytes I could have therefore a maximum of (2^(8*4)-1) valid file descriptors and consequently this would be the maximum number of files I can have open, correct?
To put it plain again:
What should I expect a (valid) file descriptor to be?
any value but -1?
回答1:
From the man page:
open()
returns a file descriptor, a small, nonnegative integer.
and then:
open()
andcreat()
return the new file descriptor, or -1 if an error occurred
回答2:
When open fail, it returns -1
, or 0xffffffff
. It has no meaning but open
failed:
Upon successful completion, the function shall open the file and return a non-negative integer representing the lowest numbered unused file descriptor. Otherwise, -1 shall be returned and errno set to indicate the error. No files shall be created or modified if the function returns -1.
The failure reason is stored in errno, you can read its value and check if it's one of the possible failures reasons EACCES
, EEXIST
, EINTR
.. etc, or just use perror to print the error message.
回答3:
Here's what a Linux manual page says:
open()
andcreat()
return the new file descriptor, or-1
if an error occurred (in which case,errno
is set appropriately).
Other systems may return other negative values in case of error.
回答4:
Range of possible values of file descriptors is from 0 to 1023 for Linux system (32-bit or 64-bit system).
You cannot create a file descriptor with value more then 1023. In case of file descriptor of value 1024, it will return an error of EBADF (bad file descriptor, error no-9).
When a negative value of file descriptor is returned it indicates that an error has occurred.
来源:https://stackoverflow.com/questions/18507057/what-are-the-possible-values-for-file-descriptors