Linux 使用popen创建的文件中出现fclose时会发生什么?
我刚刚找到了一个非常恼人的bug,有人用Linux 使用popen创建的文件中出现fclose时会发生什么?,linux,macos,popen,fclose,Linux,Macos,Popen,Fclose,我刚刚找到了一个非常恼人的bug,有人用popen打开了一个管道,但用fclose而不是pclose关闭了C文件。在Linux上这是没有问题的,但后来这个程序在OSX上编译,结果出了问题 所以我想知道,用fclose而不是pclose关闭由popen创建的管道时,会出现什么问题?为什么它在linux上工作,而不是OSX/BSD?我不知道你能想到什么样的答案来回答这些问题,但是 所以我想知道,用fclose而不是pclose关闭由popen创建的管道时,会出现什么问题 问题是程序员没有遵守pope
popen
打开了一个管道,但用fclose
而不是pclose
关闭了C文件。在Linux上这是没有问题的,但后来这个程序在OSX上编译,结果出了问题
所以我想知道,用
fclose
而不是pclose
关闭由popen
创建的管道时,会出现什么问题?为什么它在linux上工作,而不是OSX/BSD?我不知道你能想到什么样的答案来回答这些问题,但是
所以我想知道,用fclose
而不是pclose
关闭由popen
创建的管道时,会出现什么问题
问题是程序员没有遵守popen
API的设计合同。这会导致未定义的行为。您得到的确切行为是一个实现细节。从字面上讲,除了分析正在使用的C库的实现之外,您不知道会出什么问题
为什么它可以在linux上运行,而不能在OSX/BSD上运行
因为未定义的行为可能包括fclose
显然在popen
返回的文件指针上像pclose
一样工作。或者它可以包括它不以任何你观察到的方式工作。而且因为实现方式有无数种不同。它可能只适用于Linux,例如,您没有注意到这个问题。这些问题列出了在需要pclose
的地方使用fclose
时程序可能出现故障的几种方式(在各种平台上):