使用 popen 创建的 FILE 上的 fclose 发生了什么?
What is going on when fclose on FILE created with popen?
我不得不追查一个非常烦人的错误,有人使用 popen
打开管道,但使用 fclose
而不是 pclose
关闭了 C 文件。在 Linux 上这没问题,但后来这个程序在 OSX 上编译时出现了问题。
所以我想知道,当用 fclose
而不是 pclose
关闭由 popen
创建的管道时出了什么问题?为什么这适用于 linux,而不适用于 OSX/BSD?
我不确定您认为这些问题会得到什么样的答案,但是……
So I wonder, what is going wrong when closing a pipe created by popen
with fclose
instead of pclose
?
问题出在程序员没有遵守 popen
API 的设计契约。这会导致未定义的行为。你得到什么行为是一个实现细节。从字面上看,除非分析您正在使用的 C 库的实现,否则您无法知道哪里出了问题。
And why was this working on linux, but not OSX/BSD?
因为未定义的行为可以包括 fclose
显然在 popen
返回的文件指针上像 pclose
一样工作。或者它可以包括它以您观察到的任何方式不工作。而且因为实现方式有无数种不同。
它可能只出现与Linux一起工作,例如,您没有注意到这个问题。这些问题列出了在需要 pclose
的地方使用 fclose
时您的程序可能出现故障的几种方式(在各种平台上):
- use fclose to pipe of popen is a serious bug?
- fclose()/pclose() may block on some file pointers
关于未正确关闭管道可能发生的坏事(例如,zombie processes),他们有几条评论。在某些情况下,您的程序可能 一次打开管道 ,然后第二次打开管道失败。
我不得不追查一个非常烦人的错误,有人使用 popen
打开管道,但使用 fclose
而不是 pclose
关闭了 C 文件。在 Linux 上这没问题,但后来这个程序在 OSX 上编译时出现了问题。
所以我想知道,当用 fclose
而不是 pclose
关闭由 popen
创建的管道时出了什么问题?为什么这适用于 linux,而不适用于 OSX/BSD?
我不确定您认为这些问题会得到什么样的答案,但是……
So I wonder, what is going wrong when closing a pipe created by
popen
withfclose
instead ofpclose
?
问题出在程序员没有遵守 popen
API 的设计契约。这会导致未定义的行为。你得到什么行为是一个实现细节。从字面上看,除非分析您正在使用的 C 库的实现,否则您无法知道哪里出了问题。
And why was this working on linux, but not OSX/BSD?
因为未定义的行为可以包括 fclose
显然在 popen
返回的文件指针上像 pclose
一样工作。或者它可以包括它以您观察到的任何方式不工作。而且因为实现方式有无数种不同。
它可能只出现与Linux一起工作,例如,您没有注意到这个问题。这些问题列出了在需要 pclose
的地方使用 fclose
时您的程序可能出现故障的几种方式(在各种平台上):
- use fclose to pipe of popen is a serious bug?
- fclose()/pclose() may block on some file pointers
关于未正确关闭管道可能发生的坏事(例如,zombie processes),他们有几条评论。在某些情况下,您的程序可能 一次打开管道 ,然后第二次打开管道失败。