Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用popen创建的文件中出现fclose时会发生什么?_Linux_Macos_Popen_Fclose - Fatal编程技术网

Linux 使用popen创建的文件中出现fclose时会发生什么?

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

我刚刚找到了一个非常恼人的bug,有人用
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
时程序可能出现故障的几种方式(在各种平台上):

对于因未正确关闭管道而可能发生的不良事件(例如),他们有几点意见。在某些情况下,程序可能会打开一次管道,然后第二次无法打开管道