【问题标题】:What is going on when fclose on FILE created with popen?在使用 popen 创建的 FILE 上 fclose 时发生了什么?
【发布时间】:2015-07-28 15:53:33
【问题描述】:

我只需要找到一个非常烦人的错误,有人使用popen 打开管道,但使用fclose 而不是pclose 关闭了C 文件。在 Linux 上这没问题,但后来这个程序在 OSX 上编译,事情就出了问题。

所以我想知道,用fclose 而不是pclose 关闭由popen 创建的管道时出了什么问题?为什么这适用于 linux,而不适用于 OSX/BSD?

【问题讨论】:

    标签: linux macos popen fclose


    【解决方案1】:

    我不确定你认为这些问题会得到什么样的答案,但是……

    所以我想知道,用fclose 而不是pclose 关闭由popen 创建的管道时出了什么问题?

    问题出在程序员没有遵守popen API 的设计合同。这会导致未定义的行为。您得到的确切行为是实现细节。从字面上看,除非分析您正在使用的 C 库的实现,否则您无法知道可能出了什么问题。

    为什么这可以在 linux 上运行,而不是 OSX/BSD?

    因为未定义的行为可以包括fclose 显然像pclose 一样在popen 返回的文件指针上工作。或者它可以包括它不能以你观察到的任何方式工作。而且因为实现方式有无数种不同。

    【讨论】:

      【解决方案2】:

      它可能只似乎在 Linux 上工作,例如,您没有注意到问题。这些问题列出了在需要 pclose 时使用 fclose 时您的程序可能出现故障的一些方式(在各种平台上):

      那些关于未正确关闭管道可能发生的坏事(例如,zombie processes)有几个问题。在某些情况下,您的程序可能会打开管道一次,然后第二次打开管道失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        相关资源
        最近更新 更多