读书人

关于高可靠性编程讨论下,该如何解决

发布时间: 2012-04-02 19:58:59 作者: rapoo

关于高可靠性编程,讨论下
我在做一个程序,其对可靠性稳定性要求很高。因为其部署后可能连续不断地长时间运行。

我为了提高可靠性,于是检查每一个调用的返回值,每一个函数都做成返回int类型,检查每一个入口参数,等等

结果是,这个程序的代码风格让我很别扭!

随便抽取其中一个,其大致形如:

C/C++ code
if (aaa() == AAA_ERROR){    return XXX_ERROR;}if (bbb() == BBB_ERROR){    return XXX_ERROR;}if (ccc() == CCC_ERROR){    close_handle(...);    return XXX_ERROR;}if (ddd() == DDD_ERROR){    close_handle(...);    return XXX_ERROR;}if (eee() == EEE_ERROR){    fclose(...);    close_handle(...);    return XXX_ERROR;}if (fff() == FFF_ERROR){    fclose(...);    close_handle(...);    return XXX_ERROR;}


几乎每一个函数都是这个样子。

突然发现 try catch throw 是多么亲切了。

有什么好的办法来构建高可靠性程序吗?
有什么编码原则?
有什么内存管理原则?
有什么控制流设计原则?

求教!

[解决办法]
看这个系列 文章:
http://blog.csdn.net/all528/archive/2004/10/14/137060.aspx
[解决办法]
在一个头文件里,定义一下宏,来指明错误值
然后
#define RETURN_FOR_ERR(ret) {if (ret != XXX_OK) return ret;}
#define RETURN_AND_CLOSE(ret,handle) {if (ret != XXX_OK) {CloseHandle(handle); return ret;} }
[解决办法]
这种情况最好用goto语句
[解决办法]
那就swich case乐,呵呵!
[解决办法]
-_-!

不用这样吧,确保调用函数不会出错就行

我一般写程序只由调用者负责参数是正确的,被调用者无需负责
[解决办法]
个人感觉goto可能比较好
因为在Linux内核中的goto语句就是为了实现高可靠性的,Linux内核中goto语句用的很多
[解决办法]
恩 太麻烦了
我个人觉得用try ... catch...好
[解决办法]
探讨
C语言诶,没有try catch。

我的程序有个特麻烦的事,assert宏使不了。 - -

[解决办法]
高可靠性的程序...C/C++不适合,用Ada才好...
[解决办法]
MARK.
[解决办法]
下面是我自己再写纯C程序的一些原则, 给你参考下:

- 所有的struct都要有signature字段,以便校验.
- 不用的指针立刻释放.释放后立刻给值NULL.可以写一个宏来做这个事情.
- 大量使用assert,以便再debug的时候就发现潜在的问题.
- 所有的变量都要有初始值
- 每个函数再真正开始工作之前,先检查参数的合法性
- 警惕NULL参数
- 不使用可变参数函数

[解决办法]
高可靠性不是这样弄出来的。

最简单的例子,Apache 的 Prefork 和 Worker 模型都允许一个工作单元(线程或进程)在处理一定数量的 request 之后结束重新启动。真正一直运行的进程是很少有工作量的,只负责监管其它工作单元状态。系统里最可靠的是谁?肯定是 OS 自己了,所以,还是依赖 OS 吧。
[解决办法]
do{
if (aaa() == AAA_ERROR)
{
break;
}

if (bbb() == BBB_ERROR)
{
break;
}

if (ccc() == CCC_ERROR)
{
close_handle(...);
break;
}

if (ddd() == DDD_ERROR)
{
close_handle(...);
break;
}

if (eee() == EEE_ERROR)
{
fclose(...);
close_handle(...);
break;
}

if (fff() == FFF_ERROR)
{
fclose(...);
close_handle(...);
break;
}

return XXX_NOERROR;

}while(false)

close_handle(...);
return XXX_ERROR;

------解决方案--------------------


ADA也可以编windows服务,如果他不知道,那是他小白

[解决办法]

探讨
ADA也可以编windows服务,如果他不知道,那是他小白

[解决办法]
1.goto语句,如果你在C编程里,不是完全否定goto,而是不要有太多出口,这样会混淆逻辑的。
2.try catch在C++中
3.用宏对做个wrap,在C中
#define CHECK_EXPRESSION(x) if(x== FALSE) return E_RROR;

读书人网 >C语言

热点推荐