我正在使用以下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”,则输出显示在控制台中。我该如何防止这种行为?
答案 0 :(得分:2)
popen
抓住stdout
,而非stderr
。它只为输出创建一个管道,因此@ Galik的评论是正确的。使用2>&1
将stderr(2)重定向到stdout(1),或fork
进程并手动处理所有三个流。