标签: pclose

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

几个月前,我写了一个用于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表示失败.

c linux popen fclose pclose

7
推荐指数
2
解决办法
3276
查看次数

WEXITSTATUS 在成功情况下返回 popen() 的无效退出状态

我正在尝试使用 来获取子进程的存在状态popen()

情况 1:使用 shell 命令调用函数返回错误。这按预期工作。

func("du -sh _invalid_file_");
Run Code Online (Sandbox Code Playgroud)

输出:

du: cannot access '_invalid_file_': No such file or directory
Child exit value: 1
Run Code Online (Sandbox Code Playgroud)

du这里子进程的存在状态与其中运行的退出值相同bash

$ du -sh _invalid_file_
du: cannot access '_invalid_file_': No such file or directory
$ 
$ echo $?
 1
$
Run Code Online (Sandbox Code Playgroud)

情况 2:(错误情况)使用以下 shell 命令调用函数返回成功。在我的代码中,WEXITSTATUS()返回值但返回non-zero相同的命令。bash0

du: cannot access '_invalid_file_': No such file or directory
Child exit value: 1
Run Code Online (Sandbox Code Playgroud)

输出:

Child exit value: 141
Run Code Online (Sandbox Code Playgroud)

请建议解决此问题。粘贴下面的代码。

$ …
Run Code Online (Sandbox Code Playgroud)

c linux bash popen pclose

3
推荐指数
1
解决办法
500
查看次数

标签 统计

c ×2

linux ×2

pclose ×2

popen ×2

bash ×1

fclose ×1