vachel 发表于 2010-4-7 12:33:46

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错误,我哪里错了?

winston 发表于 2010-4-7 17:30:14

看现象,跟ACE_Mem_Map 无关。应该是你的系统,ulimit参数没改。默认是1024.你同时处理文件和网络链接,总和超出了这个数字,就导致无法再打开新文件。unix里面,一切皆是文件 - 设计理念。
可以使用ulimit -HSn 65535,把这个设置高。试试看。

steven99ca 发表于 2010-4-8 00:30:28

1.
典型的资源泄漏。ACE_Mem_Map是一种GUARD对象,应该不会有问题。

2.
试试
{
    ACE_Mem_Map("filename");
    .....
}就可看出是谁的问题。

3.
某些系统条件下,最大只有0xff-1个句柄。即使ulimit也没用。

[ 本帖最后由 steven99ca 于 2010-4-8 03:11 编辑 ]
页: [1]
查看完整版本: ACE_Mem_Map 的关闭句柄的问题