【问题标题】:Using system return value in C to flag errors在 C 中使用系统返回值来标记错误
【发布时间】:2013-06-23 17:29:16
【问题描述】:

我正在尝试将一些错误警报编码到我公司的一个监控程序中,但是对于 C 中 system() 命令的返回值,我没有太多运气。代码调用 scp 事务来拉取另一个服务器上的文件.....如果系统关闭或连接失败,我需要它来标记错误。

我尝试用“echo $?”确定错误返回值是什么?看起来 0 是成功返回,然后 1 代表其他任何东西,但即使将其编码到应用程序中,它也不会出现失败的尝试。我刚刚尝试从命令行获取返回值,但我不知道该值是否实际上是应用程序执行期间返回的值。

当 system() 命令返回失败时,底线是捕捉,所以我不确定是否有更好的解决方案。

谢谢大家。

编辑:这是我用来识别错误的代码摘录:

if ( system(cmd) != 0 ); 
{
  sftpCrash = TRUE;
  printf("FTP crash detected.")
  return;
}

然后 int sftpCrash 被返回给调用函数,并像这样执行:

if ( sftpCrash == TRUE)
{
  Node->color = RED; //Posts an error to our monitoring application
  sprintf(reason, "Failure on SFTP connection to %s. Please check server status.",    
  getenv("HOSTNAME"));
  printf(("SFTP crashed. Should post error alert."));
}

这一切都在 UNIX 服务器上运行和执行。

【问题讨论】:

标签: c shell command system return-value


【解决方案1】:

system() 的返回值作为返回状态的一部分传递。使用WEXITSTATUS(status) 检索它:

int status = system("my command");
if (status != -1) { // -1 means an error with the call itself
    int ret = WEXITSTATUS(status);
    ...
}

【讨论】:

  • 您好,我尝试使用 WEXITSTATUS 来识别返回值,但是在编译时出现错误,指出“表达式必须具有整数类型”。
  • @NickL。您在包含第一个标题之前添加了#define _XOPEN_SOURCE,对吗?
  • 代码和编译器是由不同的团队预先打包的,所以我不知道它是否在代码链的上游定义了。
  • @NickL。宏定义为(((status)>>8) & 0xFF),你可以用它代替WEXITSTATUS,像这样:int ret = (((status)>>8) & 0xFF);
  • 我试过这个,终于得到了回报。该值被返回为 1....看起来它正在成功完成。这是正确的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2021-09-09
  • 2017-10-02
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多