【问题标题】:Get file descriptor from file pointer without fileno()从没有 fileno() 的文件指针获取文件描述符
【发布时间】:2019-06-29 19:38:03
【问题描述】:

是否可以在不使用fileno(FILE* file)的情况下从文件指针中获取文件描述符?

特别是,是否可以只使用 C 标准库中的函数? (我的问题的原因实际上是因为 fileno() 是一个 POSIX 标准函数 但不是标准的 C.)

【问题讨论】:

  • 在 linux 上你可以查看 /proc/{你的进程 pid}/fd 并找到你打开的文件并获取相应的 fd
  • 我认为你应该为你知道的方法发布一个完整的可重现的例子,即使它是微不足道的,然后询问你想如何修改它。
  • 为什么要避免使用可靠且可移植的方法来获取信息? (它至少可以移植到其他 POSIX 系统。)您可以四处寻找<stdio.h>,看看您是否可以确定信息存储在FILE * 底层结构中的位置,但这是毫无意义的艰苦工作并且不可靠(它可能是一个完全不透明的类型,虽然它通常不是)或可移植的。
  • 文件描述符不是标准 C 的一部分。C 标准没有义务让系统在文件描述符之上实现标准 I/O 库。因此,无法使用标准 C 从文件流中获取文件描述符。文件描述符的概念不是 C 标准的一部分。这就是 fileno() 不是标准 C 函数的原因。
  • open() 函数也不是标准 C 的一部分;使用文件描述符的函数都不是标准 C 的一部分。它们通常是 POSIX 的一部分,尽管大多数系统提供了 POSIX 未定义但确实使用文件描述符的扩展函数。

标签: c


【解决方案1】:

没有。

文件描述符不是标准 C 的一部分。C 标准没有义务要求系统使用文件描述符来实现标准 I/O 库。因此,无法使用标准 C 从文件流中获取文件描述符。文件描述符的概念不是 C 标准的一部分。这就是 fileno() 不是标准 C 函数的原因。

C11 标准§7.21 Input/output <stdio.h> 没有指定任何使用文件描述符的函数。

如果fileno()不是标准函数,那么函数open()返回的值是多少?

open() 函数也不是标准 C 的一部分;使用文件描述符的函数都不是标准 C 的一部分。POSIX standard 确实提供了使用文件描述符的函数——其中很多,包括 open()fileno()。大多数系统都提供了 POSIX 未定义但使用文件描述符的扩展函数。

【讨论】:

  • 所以我猜你的答案是“否”?
  • 不,@OznOg — 答案确实是否定的。;D
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 2013-08-19
  • 2016-03-07
  • 2011-01-26
  • 1970-01-01
  • 2012-01-01
  • 2020-09-06
  • 2023-04-02
相关资源
最近更新 更多