17

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

请让我解释一下。我知道,例如,当我#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

4 回答 4

18

手册页

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

接着:

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

于 2013-08-29T09:35:12.420 回答
2

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

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

失败原因存储在 中errno,您可以读取其值并检查它是否是可能的失败原因之一EACCESEEXIST, EINTR.. 等,或者仅用于perror打印错误消息。

于 2013-08-29T09:36:10.937 回答
1

这是 Linux手册页所说的:

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

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

于 2013-08-29T09:33:53.687 回答
0

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

您不能创建值超过 1023 的文件描述符。如果文件描述符的值为 1024,它将返回 EBADF 错误(错误的文件描述符,错误号 9)。

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

于 2015-06-08T13:44:13.480 回答