首页 > 我的观点, 程序人生 > 谈”句柄泄漏”

谈”句柄泄漏”

“泄漏”是我们写程序的人老生常谈的一个话题。最为常见的就是内存泄漏(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也要配对使用。

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

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.