4

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

4

6 回答 6

5

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

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

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

于 2008-09-09T11:45:42.893 回答
4

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

于 2008-09-09T11:21:06.433 回答
2

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

于 2008-09-09T11:26:15.687 回答
0

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

于 2008-09-09T11:27:41.660 回答
0

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

@Kyle 这很重要,因为 select() 之类的语句。知道最高描述符可以提高性能。

于 2008-09-09T12:48:08.830 回答
0

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

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

关闭(2);open("/dev/null", O_WRONLY);

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

于 2009-02-27T20:59:27.053 回答