关闭

谈”句柄泄漏”

803人阅读 评论(0) 收藏 举报
分类:

“泄漏”是我们写程序的人老生常谈的一个话题。最为常见的就是内存泄漏(memory leak),本文介绍一种新的泄漏—句柄泄漏(handle leak)。在windows系统的程序中,我们经常会遇到句柄这个词,而且windows也抽象出了一种句柄类型HANDLE。在unix系统的系统中,句柄这个词用的不是很多。我们用另一个词描述它—文件描述符(file descriptior)。这里的文件是指广义的文件,因为在unix系统中,everything is a file。总的说来,句柄是指操作系统给我们的应用程序的进程分配的,用来标识某种资源的符号。这里的资源,可以是狭义的文件,可以是socket连接,也可以是一个对象。

现在,这里以linux环境中的一个socket连接中的句柄泄漏的例子来说明句柄泄漏的情况:有三个应用程序A,B,C,它们运行在不同的机器上,它们之间通过socket接口进行通信。其中A和B之间通信,A是服务端;B是客户端,B和C之间通信,B是服务端,C是客户端。它们之间的通信都是TCP的。现在,B要给A发送数据,B在发送前,如果发现和A之间的连接断开,就会去重连,在重连的时候,B并没有close已经断开连接的socket id。这样,B重连A多次之后,操作系统分配给它的socket id都将会被用完。那么,现在C如果来连接B, 就会出现B拒绝C连接的情况,为什么会这样呢?因为B进程里面已经没有可用来标识该连接的socket id,所以B只能拒绝服务。

上面就是一个socket句柄泄漏的例子。解决上面的问题的具体方法是:在B每次重连A的时候,调用系统提供的close()函数,把已经断开连接的socket的socket id释放。 举上面的例子,一方面是说明句柄泄漏的一种情况,另一方面,也是比较重要的方面,是让大家重视句柄的使用,能够正确使用句柄,一定要做到申请一个,就要时刻记得释放一个,要把申请和释放一一对应起来。就像内存使用中的malloc/free, new/delete一样,句柄的使用,申请和释放的api也要配对使用。

不管是内存也好,还是句柄也好,都是可以统称为资源的,对资源的使用,要求都是统一的,就是要“有借有还,再借不难”。我们要谨记“文明”使用操作系统提供给我们的资源,力争写出更加“和谐”的程序来!


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:95831次
    • 积分:1638
    • 等级:
    • 排名:千里之外
    • 原创:55篇
    • 转载:49篇
    • 译文:0篇
    • 评论:13条
    最新评论