【问题标题】:How do I make my c++ code know whether a command run from "system(cmd)" failed or not?如何让我的 c++ 代码知道从“system(cmd)”运行的命令是否失败?
【发布时间】:2016-10-05 12:37:41
【问题描述】:

假设我在 c++ 上使用 system("foocmd param1") 运行 unix 命令。 如果foocmd 通过stderr 将“无效参数”返回到终端,那么我如何让我的c++ 代码知道foocmd 是否失败?

这是我尝试的解决方案:

我的假设是我应该通过调用命令来检查是否有任何东西返回到 stderr。 为此,我尝试切换到 popen。目前,这是我检查的方式。我首先将我的标准错误输出到一个文件中。

sprintf(cmd, "foocmd param1 2>temp.txt");
system(cmd);

然后我检查 temp.txt 是否为空。

但必须有更好的方法。谁能帮帮我?

【问题讨论】:

  • system 返回一个状态码。
  • @GillBates 找出我要查找的退出代码似乎不是一件麻烦事吗?从我刚刚阅读的内容来看,退出代码似乎没有规则,这取决于它的编码方式。这似乎意味着即使都是错误也可以有多个退出代码?
  • 您运行的命令的文档应该记录可能的退出代码。如果不是,那么您可以假设它遵循标准约定,零是可以的,任何非零都意味着system 函数失败或命令失败(取决于system 返回正值还是负值)。基本上就像你从 shell 运行命令一样。

标签: c++ linux unix


【解决方案1】:

通常的方法是检查system()的返回值:

  • 如果为零,则命令执行成功并退出,状态为0
  • 如果是否定的,那么system() 本身就有问题,你不能假设任何事情。
  • 如果是肯定的,那么您可以使用WEXITSTATUS() 和相关的宏来找出进程是如何退出的。

请参阅system(3) 手册页了解完整详情。


大多数时候,您只对命令是否表示成功感兴趣:

if (!system(cmd)) {
    syslog(LOG_WARNING, "Command \"%s\" failed", cmd);
    /* maybe some more error handling here */
    goto err_return;
}

【讨论】:

  • 找出我要查找的退出代码不是很麻烦吗?从我刚刚阅读的内容来看,退出代码似乎没有规则,这取决于它的编码方式。这似乎意味着即使都是错误也可以有多个退出代码?
  • 大多数时候,简单地针对零进行测试就足够了:if (!system(cmd)) { /* error handling */ } 这一点都不麻烦。您只需在需要时为复杂性付费。
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多