有时执行外部命令失败(迟早)

时间:2014-04-14 08:09:59

标签: c debugging

我写了一个服务器应用程序,让我们称之为简单' server',这是在后台工作。 这是服务器的核心:

int main( int argc, char **argv ) {
  // define some variables..
  // fork()..
  // connect to MySQL
  // etc...

  while (1) {
    myfunc_1();
    myfunc_2();
    myfunc_3();
    myfunc_4();
    myfunc_5();
    myfunc_6();
    myfunc_7();
    ...
    syslog( LOG_NOTICE, "Sleeping..." );
    sleep( 90 );
  }

  exit (EXIT_SUCCESS);
}

问题在于myfunc_3()和myfunc_5()。

两个函数的核心都调用外部系统命令:myfunc_3() - > nfdump,myfunc_4() - > DOCSIS。

以下是一些相关代码:

int myfunc_3( void ) {
  // define some variables
  int ret;
  char nfdump_cmd[1024];

  // I assemble the 'nfdump_cmd' command-string with sprintf..

  ret = system( nfdump_cmd );
  if ( ret == 0 ) {
    syslog( LOG_NOTICE, "nfdump success." );
  }
  else {
    syslog( LOG_ERR, "nfdump failed!" );
    return (-1);
  }

  return (0);
}

myfunc_5()非常相似,当我们需要创建一个modem / mta配置文件时,他调用docsis程序(Docsis编码器)。

问题:'服务器'在后台运行,并完成其工作,但只有2-3周!

myfunc_3()或myfunc_5()迟早不能成功执行外部命令,报告返回代码为-1。 (如果myfunc_3()不成功,那么myfunc_5()也是不成功的,这是100%。)

在这种情况下,不需要做任何其他事情,只需重新启动服务器,一切正常! (直到2-3周......)

我尝试更换系统'命令' popen'方法,但结果是一样的:(

我的问题是:如何调试和解决这个令人讨厌的错误?

1 个答案:

答案 0 :(得分:1)

几天后你的服务器出现故障,所以我猜以下可能是原因。

1)确保fopen()或open()发生了多少fclose()或close()。在linux中,任何进程都只能有有限数量的打开描述符。

2)确保分配的Heap和其他资源在使用后被释放。

3)确保任何功能都没有积极地使用堆栈并导致进程终止。