我写了一个服务器应用程序,让我们称之为简单' 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'方法,但结果是一样的:(
我的问题是:如何调试和解决这个令人讨厌的错误?
答案 0 :(得分:1)
几天后你的服务器出现故障,所以我猜以下可能是原因。
1)确保fopen()或open()发生了多少fclose()或close()。在linux中,任何进程都只能有有限数量的打开描述符。
2)确保分配的Heap和其他资源在使用后被释放。
3)确保任何功能都没有积极地使用堆栈并导致进程终止。