ACE_Mem_Map 的关闭句柄的问题
我使用ACE_Mem_Map 创建新内存映射文件,然后写入数据,关闭ACE_Mem_Map,因为我是网络接收大量小图片文件,所以在接收到400个左右就出现unable to register client handler: Too many open files错误!关键代码如下,请大家帮忙看看什么原因:
delete pMapPicture;
pMapPicture = NULL;
pMapPicture = new ACE_Mem_Map;
int nret =pMapPicture->map((const ACE_TCHAR *)picName
,pictureLength
,O_RDWR | O_CREAT
,ACE_DEFAULT_FILE_PERMS
,PROT_RDWR,ACE_MAP_SHARED);
/* 拷贝数据*/
pMapPicture->sync();
pMapPicture->unmap();
pMapPicture->close_filemapping_handle();
pMapPicture->close();
delete pMapPicture;
pMapPicture = NULL;
循环执行上面代码!
几百次后就出现 unable to register client handler: Too many open files错误,我哪里错了? 看现象,跟ACE_Mem_Map 无关。应该是你的系统,ulimit参数没改。默认是1024.你同时处理文件和网络链接,总和超出了这个数字,就导致无法再打开新文件。unix里面,一切皆是文件 - 设计理念。
可以使用ulimit -HSn 65535,把这个设置高。试试看。 1.
典型的资源泄漏。ACE_Mem_Map是一种GUARD对象,应该不会有问题。
2.
试试
{
ACE_Mem_Map("filename");
.....
}就可看出是谁的问题。
3.
某些系统条件下,最大只有0xff-1个句柄。即使ulimit也没用。
[ 本帖最后由 steven99ca 于 2010-4-8 03:11 编辑 ]
页:
[1]