最近用到了ACE的UUID,使用方法是网上找的,如下:
tstring sUuid;
ACE_Utils::UUID_GENERATOR::instance()->init();
ACE_Utils::UUID uuid;
ACE_Utils::UUID_GENERATOR::instance()->generateUUID(uuid);
sUuid.assign(uuid.to_string ()->c_str ())
return sUuid;
将这段代码封装成一个函数,在很多地方都用到了他,结果问题出来了,在linux环境中连接数据库的时候报系统资源不足,在windows环境跑着没有任何问题。
最开始的时候根本没怀疑到UUID上去,还以为是其他哪里的问题,当时看系统限制的进程打开文件句柄数是1024,通过跟踪程序,发现程序的socket句柄一直在涨,当时程序用到socket的地方只有发送UDP数据和连接数据库,于是使劲在那里面找,把人都快弄残废了。最后逐步排查,费了九牛二虎之力,才找到UUID上。
最后一看ACE的源代码,发现在ACE_Utils::UUID_GENERATOR::instance()->init();函数中打开了一个socket没有关闭,代码如下
#elif defined (linux)
struct ifreq ifr;
ACE_HANDLE handle =
ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);
if (handle == ACE_INVALID_HANDLE)
{
return -1;
}
ACE_OS::strcpy (ifr.ifr_name, "eth0");
if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0)
{
ACE_OS::close (handle);
return -1;
}
struct sockaddr* sa =
(struct sockaddr *) &ifr.ifr_addr;
ACE_OS::memcpy (node->node,
sa->sa_data,
6);
return 0;
#else
里面的handle句柄在后面没有正常关闭。
由于我们用的是ACE5.4版本,于是我想看看最新的5.5.3版本是怎么样的,结果5.5.3版本的代码如下:
#elif defined (linux)
struct ifreq ifr;
ACE_HANDLE handle =
ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);
if (handle == ACE_INVALID_HANDLE)
return -1;
ACE_OS::strcpy (ifr.ifr_name, "eth0");
if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0)
{
ACE_OS::close (handle);
return -1;
}
struct sockaddr* sa =
(struct sockaddr *) &ifr.ifr_addr;
ACE_OS::close (handle);
ACE_OS::memcpy (node->node,
sa->sa_data,
6);
return 0;
#else
handle已经关闭了,估计是新版本修复了这个bug
由于不方便将ACE版本升级到最新版本,最后只能在自己的代码中控制只调用一次ACE_Utils::UUID_GENERATOR::instance()->init()函数,不知道这样后,生成的UUID还是不是真正的UUID,需要仔细研究下
分享到:
相关推荐
手机UUID!
PB生成UUID
主要介绍了java获取UUID与UUID的校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
UUID适合长传使用,有效避免重名问题.还可以自己定义其生成的文件名的类型
java 生成8位UUID,解决UUID2太长的问题,欢迎下载。后续代码,陆续放出
利用UUID生成完全不重复的数字 package com.example.uuid; import java.util.UUID; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View....
UUID生成工具类
Math.uuid.js js 生成 uuid
联想ThinkPad System UUID添加工具,直接支持U盘启动盘制作
UUID 由RFC4122文档定义,里面有实现,不过需要加上SHA1算法,MD5算法才完整。我整理了SHA1 MD5算法,实现了一个可直接使用的UUID的生成算法。
截取json将之装换成uuid,uuid作为唯一标识符,可以做排重处理,删除重复值。
详细介绍了impala创建自定义函数去除‘-’的uuid,包括maven所用的pom.xml
UDID自从被苹果公司禁止开发者使用,UUID便成为替代品,一般使用UUID的时候,当程序被卸载重装之后,UUID一般会被改变,无法保证唯一。但使用我代码里的方法,便可以保证唯一,即使程序被卸载重装之后也仍然是卸载前...
jdk与javauuidgenerator生成uuid
简单的uuid生产代码 uuid生产代码 uuid生产代码
此工具可以协助大家读取系统中的UUID,即SMBIOS TYPE1部分的信息.
利用雪花算法生成uuid
javascript 随机生成36为的UUID值
破解软件必备 修改系统的uuid值 记得以管理员身份运行
为你提供一个可以产生一个不重复的UUID工具