【问题标题】:Close a FILE pointer without closing the underlying file descriptor关闭 FILE 指针而不关闭底层文件描述符
【发布时间】:2010-12-08 21:39:39
【问题描述】:

通过使用fdopen()fileno(),可以使用现有文件描述符打开流。但是,关闭文件的正确方法是使用流打开文件后使用fclose() FILE 指针。如何关闭流,但保留打开的文件描述符?

这种行为类似于调用fflush(),然后调用fileno(),然后再不使用FILE 指针,除非在关闭时。另一个问题是,如果你再次fdopen(),现在有多个FILE 指针,你只能关闭其中一个。

【问题讨论】:

    标签: c file stream stdio libc


    【解决方案1】:

    如果您使用的是 POSIXy 系统(我假设您是,因为您有 fileno()),您可以使用 dup() 克隆文件描述符:

    int newfd = dup(fileno(stream));
    fclose(stream);
    

    或者你可以给fdopen()一个重复的文件描述符:

    FILE *stream = fdopen(dup(fd), "r");
    

    无论哪种方式,fd 的另一个副本都不会以FILE * 关闭。但是,请记住位置指针 共享的,因此如果同时使用两者,请小心。此外,当您关闭副本时,原始 fd 上持有的任何 fcntl()都会被释放。

    【讨论】:

    • windows等平台支持fileno()!我不敢相信我没有想到这个 dup() 解决方案,非常优雅,而且很明显
    • 您是否还需要 dup2() 新 fd 回到原始 fd 然后 close() 新 fd 所以一切都恢复到以前的样子,除了文件流被关闭? :D 这意味着在执行 fclose() 之前需要 oldfd = fileno(stream)。
    • Jonathan,在多线程应用程序中做的事情很有趣。在将 fd 交给fdopen 之前最好先dup,这样您就可以确保它永远不会触及您的原件。
    • @bdonlan,解释一下:我不明白它有多活泼
    • 线程 A:close(42);线程 B: open(...) (返回 42) 线程 A: dup2(42, 54);现在线程 B 的 fd 已关闭并替换为线程 A 正在使用的任何内容。
    【解决方案2】:

    如果一切都失败了,dup(2) 可以提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-14
      • 2017-09-05
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多