当在 C 中创建套接字或打开/创建文件时,分配给套接字/文件的文件描述符是否保证是可用的最低值描述符?C 规范对于这方面的文件描述符分配有何规定(如果有的话)?

有帮助吗?

解决方案

它不保证是最低的,并且取决于实现 (1). 。然而,一般来说,分配打开文件描述符的例程使用一种为您提供第一个打开时间的方法。可能是在几个较低的描述符释放后,立即给您留下一个比您预期更高的描述符。

不过,我能想到知道这一点的唯一原因是选择函数,如果您将需要检查的最高文件描述符传递给它,则该函数会加速。

(1) 请注意,遵循 IEEE 标准的那些实现确实保证了文件的最低未使用描述符,但这可能不适用于套接字。并非每个实现都遵循 open() 的 IEEE 标准,因此如果您正在编写可移植软件,最好不要依赖它。

其他提示

我认为您不会在 C 规范中找到它,更可能在您的操作系统规范中找到它。我对 Linux 的体验是它总是最低的。

我会用另一个问题来反驳这个问题——为什么这很重要?您不应该将文件描述符与任何内容进行比较(除非检查 stdin/stdout/stderr)或用它进行数学运算。只要它适合 int (并且保证),这就是您真正需要知道的。

史蒂夫·M是对的;C 没有套接字的概念,它的文件 I/O 函数使用 [指向] FILE 对象的指针,而不是描述符。

@aib open()、close()、lseek()、read()、write() 都使用文件描述符。我几乎从不使用流进行 I/O。

@Kyle 这很重要,因为像 select() 这样的语句。了解最高描述符可以提高性能。

C 规范说它依赖于实现。如果您正在查看 Unix 实现,open(2) 的手册页会说“成功调用返回的文件描述符将是当前未为进程打开的最小编号的文件描述符。”

如果您尝试将特定文件附加到特定描述符,这会有所帮助。假设您想将 stderr 重定向到 /dev/null。就像是

关闭(2);打开(“/ dev / null”,O_WRONLY);

应该这样做。当然,您应该捕获 open 返回的 fd 并确保它是 2。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top