使用popen创建FILE时fclose发生了什么?

时间:2015-05-16 22:06:13

标签: linux macos popen fclose

我只需要追踪一个非常烦人的错误,其中某人使用popen打开管道,但使用fclose而不是pclose关闭了C FILE。在Linux上这没有问题,但后来这个程序是在OSX上编译的,事情变得很糟糕。

所以我想知道,关闭popen使用fclose而不是pclose创建的管道会出现什么问题?为什么这个在linux上工作,而不是OSX / BSD?

2 个答案:

答案 0 :(得分:3)

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

对于未正确关闭管道可能发生的不良事件(例如zombie processes),有几条评论。在某些情况下,您的程序可能会打开一个管道,然后再次无法打开管道。

答案 1 :(得分:0)

我不确定你能想到的答案是什么,但是......

  

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

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

  

为什么这个在linux上工作,而不是OSX / BSD?

因为未定义的行为可能包含fclose,显然像pclosepopen返回的文件指针上工作。或者它可能包括它无法以您观察到的任何方式工作。而且因为实现方式有很多不同。