几个月前,我写了一个用于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表示失败.
我正在尝试使用 来获取子进程的存在状态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)