公 告

欢迎各位网友添加友情链接,在您添加本博客:http://linux0818.blogspot.com/ 做为链接后, E-mail:linux0818@gmail.com给我,我将将您的网址添加到本博客。

2008年10月13日星期一

关于fatal致命错误的处理

在平时我们写一些小的例子程序,可能对一些程序的退出并没有做出一些更好的做法,一般就是使用exit(-1)或return 等方法退出。但是,在一个产品的开发过程中,特别是长时间不重启工作的产品,我们还使用这种方法就有点不负“责任”了。

fatal在计算机中我们理解为“致命的”,也就是说出现一些致命的错误时,我们得处理好善后工作后才能退出。不然对有些没有MMU且不经常断电重启的嵌入式产品来说,会使你的内存不断的耗尽。当然,对一些服务器也会有不同的情况发生。

今天在看到squid2.6的源代码时,发现里面就有这么一个好的方法,这也是开源产品及大型产品中经常用到的,现在贴出来研究一下:

--------------------------------------------------------------------------------
void fatal(const char *message)
{
releaseServerSockets();
/* check for store_dirs_rebuilding because fatal() is often
* used in early initialization phases, long before we ever
* get to the store log. */
if (0 == store_dirs_rebuilding)
storeDirWriteCleanLogs(0);
fatal_common(message);
if (shutting_down)
exit(1);
else
abort();
}
--------------------------------------------------------------------------------

该函数就对系统在发生异常时调用此函数对相应的资源释放以后才退出,这样明显对系统的资源就进行了一个很好的管理了。能做到有申请,就有释放。当然,我在网上也找了两个实例,一起贴出来,供网友及我以后参考:

example 1:
--------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

void fatal(char *fmt, ...)
{
va_list v;
va_start(v, fmt);
vprintf(fmt, v);
va_end(v);
exit(0);
}

int main(int argc, char *argv[])
{
fatal("This is a fatal.%d\n", 78);
return 0;
}
--------------------------------------------------------------------------------

example 2:
--------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

int fatal(char *s)
{
perror(s);
exit(1);
}

int main(int argc, char *argv[])
{
fatal("Fatal Error:\n");
return 0;
}
--------------------------------------------------------------------------------

没有评论:

发表评论