文件描述符的可能值是什么?

时间:2013-08-29 09:27:21

标签: c linux validation file-descriptor

我很想知道文件描述符的有效值。

请让我解释一下。我知道,例如,当我在我的linux系统上使用#include <unistd.h>然后调用打开文件进行阅读时:

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个字节,因此最多可以存储4个字节 (2 ^(8 * 4)-1)有效的文件描述符,因此这是我可以打开的最大文件数,对吗?

再说一遍:

我应该期待(有效)文件描述符是什么?

任何值,但-1?

4 个答案:

答案 0 :(得分:15)

来自man page

  

open()返回文件描述符,一个小的非负整数

然后:

  

open()creat()会返回新的文件描述符,如果发生错误,则返回-1

答案 1 :(得分:2)

open失败时,会返回-10xffffffff。它没有任何意义,但open失败了:

  

成功完成后,该函数将打开文件并且   返回一个非负整数,表示最低编号的未使用   文件描述符。否则,返回-1并将errno设置为   表明错误。如果是,则不应创建或修改任何文件   函数返回-1。

失败原因存储在errno中,您可以阅读其值并检查是否是可能的失败原因之一EACCESEEXISTEINTR等等,或者只使用perror打印错误消息。

答案 2 :(得分:1)

以下是Linux manual page所说的内容:

  

open()creat()返回新的文件描述符,如果发生错误则返回-1(在这种情况下,errno已正确设置)。

如果出现错误,其他系统可能会返回其他负值。

答案 3 :(得分:1)

对于Linux系统(32位或64位系统),文件描述符的可能值范围为0到1023。

您无法创建值大于1023的文件描述符。如果文件描述符值为1024,则将返回错误的EBADF(错误的文件描述符,错误号为9)。

当返回文件描述符的负值时,表示发生了错误。