【问题标题】:Can multiple `FILE` objects share the same file descriptor?多个 FILE 对象可以共享同一个文件描述符吗?
【发布时间】:2018-08-30 00:24:54
【问题描述】:

来自 APUE

每个标准 I/O 流(即每个 FILE 对象)都有一个关联的文件描述符。

在一个程序中,多个FILE对象可以共享同一个文件描述符吗?

如果是,是否通过使用相同的给定文件描述符多次调用fdopen() 来完成,每次都返回指向不同FILE 对象的指针?

如果我在一个指向给定FILE对象的指针上flcose(),如果有另一个FILE对象共享同一个文件描述符,那么FILE对象的文件描述符是否仍然存在并连接到该文件?

谢谢。

【问题讨论】:

  • 您从不使用FILE,而只使用FILE*,它只是一个指针,因此可以轻松复制。给定FILE *f,您可以使用FILE *g = f 创建第二个指向同一描述符的对象,但您只能在其中一个上调用fclose
  • 我不确定你所要求的是否是你真正想要的......
  • 另见 Stevens 对dupdup2 和朋友的讨论。

标签: c linux io


【解决方案1】:

是的,但这是一个非常糟糕的主意,因为fclose 关闭了关联的 fd,因此你只能在其中一个 fclose 没有它导致 close 在不再属于 @ 的文件描述符上987654325@,并且可能已被重新分配用于其他用途。原则上,即使在进程终止时也会发生这种情况,除非您使用_exit/_Exit 或异常终止。

一个相关的问题是您是否可以使用不同的文件描述符(每个由dup 生成,用于具有多个文件的相同底层打开文件描述。对此,答案也是肯定的,虽然这可能是个坏主意,但 POSIX 规定了一些规则,如果你遵守它们,它们就会安全:

2.5.1 Interaction of File Descriptors and Standard I/O Streams

【讨论】:

  • 谢谢。我试图了解您“这是一个非常糟糕的主意”的原因。 (1)如果两个FILE对象共享同一个文件描述符,一个FILE对象上的fclose()会不会调用文件描述符上的close(),因为还有另一个FILE对象使用文件描述符?另一个FILE 对象上的fclose() 是否会在文件描述符上调用close(),因为不再有FILE 对象使用文件描述符?
  • (2) “可能已被重新分配用于其他用途”是什么意思? (3)“即使在进程终止时也会发生这种情况,除非你使用_exit/_Exit或异常终止”中的“this”是什么意思?
  • @tim: 在FILE 对象中没有另一个FILE 对象共享同一个fd 的记录。当您fclose FILE*s 之一时,它将关闭 fd。然后另一个FILE* 将无法使用。当另一个FILE*关闭时,fd会再次关闭。如果那个fd 还没有被重新分配,那可能没问题,虽然是错误的;如果它已被重新分配,关闭它将关闭程序的其他部分仍在使用的 fd,然后当它尝试使用其 fd 时会出现虚假错误。除非您调用 _[eE]xit,否则所有 FILE 对象将在您的程序退出时 br fclose()*ed。
  • 所以我同意。这是一个非常糟糕的主意。
  • @tim:因为 C 的哲学是不要浪费周期检查你没有做你被告知不要做的事情。不违反规则的人会喜欢使用这个循环来做一些更有用的事情。如果您正在寻找一种兼作保姆的编程语言,那么有很多选择:-)
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多