谈”句柄泄漏”

转载 2015年11月19日 15:35:39

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

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


相关文章推荐

【分享】文件句柄数递增问题排查--引申出SOCKET泄露

最近在linux上开发的

句柄泄露实例分析

在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子。例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象,...
  • zhjmyx
  • zhjmyx
  • 2016年12月16日 16:51
  • 795

应用句柄泄露分析实例

Monkey测试由于操作量大,并且速度比较快,总是会出来一些隐藏的比较深的问题,比如内存泄露啊,句柄泄露啊等等。 但是往往这类问题通过Monkey日志又很难直接定位到。需要有一些经验才能快速定位并解决...

system调用导致子进程socket句柄泄漏问题分析

 问题引出:A进程与B进程各自独立,都是服务器进程,常驻系统,互不相干。在某次重启A进程后,发现由于固定监听的端口被占用而无法启动。检查,发现是B进程占用了该端口,检查B进程代码,没有相关的打开...

Windows 句柄泄露学习总结

句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我...

导致内存泄漏的原因

内存泄漏是指堆内存的泄漏。 堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。 应用程序一般使用malloc,realloc,new等...

socket句柄泄漏问题的定位: losf和strace的联合使用!

最近遇到一个socket句柄泄漏的问题, 我们来简要说说如何定位:        1.  确定哪个进程在泄漏, 可以用命令 lsof -n|awk '{print $2}'| sort | uniq ...
  • stpeace
  • stpeace
  • 2017年02月25日 20:06
  • 1594

tcp socket文件句柄泄漏

今天发现有台redis机器上出现socket个数告警,这是很奇怪的现象。因为一台redis服务器上就部署了几个redis实例,打开的端口应该是有限。 1、netstat显示的tcp连接数正常 ...

windbg检测句柄泄露(可定位到具体代码)

1、用c++写一个句柄泄露的样例程序: #include "stdafx.h" #include void fun1(void); void fun2(void); voi...
  • dahaiI0
  • dahaiI0
  • 2012年04月09日 16:42
  • 2949

句柄泄露与CloseHandle()

摘自:http://blog.chinaunix.net/uid-21783276-id-2689047.html CloseHandle()函数的使用?? 很多程序在创建线程都这样写的:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈”句柄泄漏”
举报原因:
原因补充:

(最多只允许输入30个字)