我只需要追踪一个非常烦人的错误,其中某人使用popen
打开管道,但使用fclose
而不是pclose
关闭了C FILE。在Linux上这没有问题,但后来这个程序是在OSX上编译的,事情变得很糟糕。
所以我想知道,关闭popen
使用fclose
而不是pclose
创建的管道会出现什么问题?为什么这个在linux上工作,而不是OSX / BSD?
答案 0 :(得分:3)
可能只有出现才能使用Linux,例如,您没有注意到该问题。这些问题列出了使用fclose
时需要pclose
的程序可能出现故障的方式(在各种平台上):
对于未正确关闭管道可能发生的不良事件(例如zombie processes),有几条评论。在某些情况下,您的程序可能会打开一个管道,然后再次无法打开管道。
答案 1 :(得分:0)
我不确定你能想到的答案是什么,但是......
所以我想知道,关闭
popen
使用fclose
而不是pclose
创建的管道会出现什么问题?
程序员没有遵守popen
API的设计合同,出了什么问题。这导致未定义的行为。您获得的确切行为是实现细节。从字面上看,除了通过分析您正在使用的C库的实现之外,您无法知道可能出现的问题。
为什么这个在linux上工作,而不是OSX / BSD?
因为未定义的行为可能包含fclose
,显然像pclose
在popen
返回的文件指针上工作。或者它可能包括它无法以您观察到的任何方式工作。而且因为实现方式有很多不同。