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

h9a6wy2h  于 2023-05-28  发布在  其他
关注(0)|答案(5)|浏览(270)

我很想知道文件描述符的有效值。
请让我解释一下。我知道,例如,当我在我的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个字节,因此我可以有最大(2^(8*4)-1)个有效的文件描述符,因此这将是我可以打开的最大文件数,对吗?
再简单地说:

我应该期望一个(有效的)文件描述符是什么?

除了-1以外的任何值?

7fyelxc5

7fyelxc51#

关于man page
open()返回一个文件描述符,一个小的非负整数
然后:
open()creat()返回新的文件描述符**,如果发生错误则返回-1**

h22fl7wq

h22fl7wq2#

open失败时,它返回-10xffffffff。没有意义,但open失败:
成功完成后,函数应打开文件并返回一个非负整数,表示编号最低的未使用文件描述符。否则,将返回-1并设置errno以指示错误。如果函数返回-1,则不得创建或修改任何文件。
故障原因存储在errno中,您可以读取其值并检查它是否是可能的故障原因EACCESEEXISTEINTR之一。等等,或者使用perror打印错误消息。

vlju58qv

vlju58qv3#

对于Linux系统(32位或64位系统),文件描述符的可能值范围为0到1023。
不能创建值大于1023的文件描述符。如果文件描述符的值为1024,则将返回EBADF错误(错误文件描述符,错误号-9)。
当返回文件描述符的负值时,表示发生了错误。

5hcedyr0

5hcedyr04#

下面是Linux manual page的说明:
open()creat()返回新的文件描述符,如果发生错误,则返回-1(在这种情况下,将适当设置errno)。
其他系统在出错的情况下可能返回其他负值。

doinxwow

doinxwow5#

文件描述符基本上是一种系统跟踪正在运行的程序中所有打开的文件(以及一些其他类型的I/O通道)的方式。它们被表示为整数,您可以将它们看作是程序用来处理文件的一种“ID”或“句柄”。
让我们考虑一个现实生活中的类比。想象一下,你是一名图书管理员,每当有人借走一本书,你就给予他们一张带有唯一编号的票。后来,当他们想还书或询问这本书时,他们会给你看票,你可以立即知道他们说的是哪本书。在这个类比中,文件描述符就是票据上的数字。
当你在程序中打开一个文件时,操作系统会给你一个文件描述符--最小的未使用的数字--你可以用它来在将来引用这个文件。当您读取或写入文件时,您使用该文件描述符。当你处理完这个文件时,你“关闭”它,这告诉系统你已经处理完了这个文件描述符,它可以把这个数字用在别的地方。
fd的确切限制取决于您的系统,但它通常相当高(数千甚至数万)。每个打开的文件、管道或其他资源消耗一个文件描述符。
以下是一些标准的文件描述符值:
0:标准输入(stdin)
1:标准输出(stdout)
2:标准误差(stderr)
这些是每个进程中可用的默认文件描述符。当您使用open函数打开一个文件时,您将获得一个文件描述符,该文件描述符始终是当前未为进程打开的编号最小的文件描述符。通常第一个打开的文件为3,第二个打开的文件为4,依此类推。
文件描述符保持打开状态,直到显式关闭或进程终止。当您使用完文件描述符时,总是关闭它们以防止文件描述符泄漏是很重要的,这可能会导致进程耗尽其可用的文件描述符数量。
示例:

write(1, "a", 1); //First argument represent the Standard Output.
write(4, "a", 1); //4 is not currently open or valid, then the write function will fail, and it will return -1 to indicate an error. 

int fd;

fd = open("42", O_RDWR | O_CREAT | O_APPEND, 0777); //Create file "42"
printf("%d\n", fd); // => fd value is 3 because it takes the next smallest int available (0, 1 and 2) are always taken.

fd可以高达数千取决于您的系统。

相关问题