防止 popen 显示命令的输出
Prevent popen from showing a command's output
我正在使用以下 C++ 函数执行简单命令并将其输出到 std::string:
std::string runcmd(std::string cmd)
{
std::stringstream output;
FILE *stream = popen(cmd.c_str(), "r");
char buffer[512];
if( !stream )
{
return "popen error";
}
while(fgets(buffer, sizeof(buffer), stream) != NULL)
{
output << buffer;
}
pclose(stream);
return output.str();
}
但是我尝试过的每个命令的行为都不相同。例如,如果我调用 "ls -l ~" 一切正常,但如果我调用 "crontab -l",输出将显示在控制台中。我怎样才能防止这种行为?
popen
捕获 stdout
,而不是 stderr
。它只为输出创建一个管道,所以@Galik 的评论是正确的。使用 2>&1
将 stderr(2) 重定向到 stdout(1),或 fork
进程并手动处理所有三个流。
我正在使用以下 C++ 函数执行简单命令并将其输出到 std::string:
std::string runcmd(std::string cmd)
{
std::stringstream output;
FILE *stream = popen(cmd.c_str(), "r");
char buffer[512];
if( !stream )
{
return "popen error";
}
while(fgets(buffer, sizeof(buffer), stream) != NULL)
{
output << buffer;
}
pclose(stream);
return output.str();
}
但是我尝试过的每个命令的行为都不相同。例如,如果我调用 "ls -l ~" 一切正常,但如果我调用 "crontab -l",输出将显示在控制台中。我怎样才能防止这种行为?
popen
捕获 stdout
,而不是 stderr
。它只为输出创建一个管道,所以@Galik 的评论是正确的。使用 2>&1
将 stderr(2) 重定向到 stdout(1),或 fork
进程并手动处理所有三个流。