【问题标题】:File Descriptor Assignment in CC中的文件描述符分配
【发布时间】:2010-09-08 06:35:06
【问题描述】:

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

【问题讨论】:

    标签: c file-descriptor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不正确。将它与 select 一起使用需要它适合 fd_set 对象。由于 POSIX 要求按顺序分配文件描述符,因此您可能同样希望使用自己的位数组对象来存储文件描述符集,您可以轻松地做到这一点。
      【解决方案3】:

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

      【讨论】:

      • C实际上有两种读取文件的方式,一种用FILE对象,一种用文件描述符。
      • 基于文件描述符的方式是Unix API提供的系统调用接口,不是C本身的一部分。
      【解决方案4】:

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

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

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

      【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

        • 或者,使用dup2 确保将正确的流分配给预期的文件描述符。
        • 如果您的程序使用线程并且您没有严格控制其他线程正在做什么,dup2 是唯一安全的方法。 close/open 引入了竞争条件,在此期间另一个线程可能会获取文件描述符。
        猜你喜欢
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2018-08-15
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多