使用fclose管道popen是一个严重的错误?

car*_*los 7 c linux popen fclose pclose

几个月前,我写了一个用于Linux的CGI应用程序,用于popen()读取命令的输出,然后我关闭管道fclose().

现在,我读到需要使用密切管道pclose().

手册说:

返回值popen()是一个正常的标准I/O流,除了必须用pclose()而不是 关闭之外,它在所有方面都是fclose(3).

我的代码是这样的:

if ((NULL != (f = popen(command.value, "r")))) {
    //do something
    fclose(f);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

我的错误有安全问题吗?该计划目前正在制作中.在测试中它没有做任何问题.真正需要的,用打补丁pclose()来代替fclose()?注意:我只在程序中打开一次PIPE.

今天,在我当地的家里,我做了一些测试,fclose()pclose()没有返回EOF表示失败.

Chr*_*ung 11

根据这个线程,使用fclose而不是pclose意味着管道另一端的进程不会被收获,因此它保持僵尸状态.


Mag*_*1um 5

如果在管道上使用fclose,则会出现文件描述符泄漏,因为fclose不会释放内核中的文件指针(这是在创建管道时创建的,因为它是一个文件).

虽然到目前为止您的测试没有显示任何问题,但运行您的程序3000次(或者如何允许多个文件描述符,我认为更高的int)并观察何时您将无法再创建管道.

  • 通常,stdio流上的`fclose`实际上*会关闭底层的管道描述符(它隐藏在`fp - > _ fileno`或任何字段被命名),所以它更像是一个zombie-proc-leak而不是fd泄漏. (2认同)