【发布时间】:2016-03-29 19:11:24
【问题描述】:
我正在使用以下 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”,则输出会显示在控制台中。如何防止这种行为?
【问题讨论】:
-
我不能重复你的错误。当我运行它时,您的代码对这两个命令的工作方式相同。也许错误在其他地方?
-
我不这么认为。我的程序只是一个包含以下行的主程序: runcmd("ls -l ~"); runcmd("crontab -l");
-
crontab命令是否打印错误消息?除非您重定向错误流,否则它将出现在控制台上。 -
它只是通知“用户没有 crontab -----”。那我应该重定向它吗?
-
如果您想要错误输出,那么您必须在命令末尾使用
2>&1重定向它。如果您希望能够分别读取输出和错误输出,那么我认为您必须使用fork()。