linux下OCI开发Oracle ,OCIServerAttach卡死问题

wzy9854 2014-04-23 03:54:05
最近在研究linux下OCI接口,写了一个connect函数,结果不能用,每到OCIServerAttach就会卡死,用gdb调试还会报出
siglongjmp 信号错误 不知道是linux环境没配置正确 还是tnsnames.ora有问题
编译也能通过,程序也能跑起来不报错,就是会卡在OCIServerAttach函数,求大神啊!!!!
代码如下,应该不会是代码的问题T.T


void* __stdcall ictora_connect(char *dsn,char *user,char *pass, int flag)
{
ICTORA_ENV *l_env = NULL;
OCIEnv *myenvhp = NULL;
sword errno = 0;
sword retcode = 0;
char outmsg[512+1];

l_env = (ICTORA_ENV*)malloc(sizeof(ICTORA_ENV));
memset(l_env,0,sizeof(ICTORA_ENV));

//1。初始化OCI运行环境
retcode = OCIEnvCreate((OCIEnv **) &(l_env->l_envhp), (ub4) OCI_DEFAULT,(dvoid *) 0, (dvoid * (*)(dvoid *,size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0);
if(retcode != OCI_SUCCESS)
{
ictora_free_env(l_env);
return NULL;
}

retcode = OCIHandleAlloc( (dvoid *) l_env->l_envhp, (dvoid **) &(l_env->l_errhp), OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0);
if(retcode != OCI_SUCCESS)
{
ictora_free_env(l_env);
return NULL;
}
//2。初始化连接环境资源
retcode = OCIHandleAlloc( (dvoid *) l_env->l_envhp, (dvoid **) &(l_env->l_srvhp), OCI_HTYPE_SERVER,(size_t) 0, (dvoid **) 0);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}

retcode = OCIHandleAlloc( (dvoid *) l_env->l_envhp, (dvoid **) &(l_env->l_svchp), OCI_HTYPE_SVCCTX,(size_t) 0, (dvoid **) 0);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}

retcode = OCIAttrSet( (dvoid *) l_env->l_svchp, OCI_HTYPE_SVCCTX, (dvoid *)l_env->l_srvhp,(ub4) 0, OCI_ATTR_SERVER, (OCIError *) l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}

//3。设置连接属性
printf("Before OCIServerAttach\n");
retcode = OCIServerAttach( l_env->l_srvhp, l_env->l_errhp, (text *)dsn, strlen(dsn), OCI_DEFAULT);
printf("Pass OCIServerAttach\n");
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}

retcode = OCIHandleAlloc((dvoid *) l_env->l_envhp,
(dvoid **)&(l_env->l_authp),(ub4) OCI_HTYPE_SESSION,
(size_t) 0, (dvoid **) 0);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIAttrSet((dvoid*)l_env->l_svchp,(ub4)OCI_HTYPE_SVCCTX,
(dvoid*)l_env->l_authp,(ub4)0,(ub4)OCI_ATTR_SESSION,
(OCIError*)l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}

retcode = OCIAttrSet((dvoid *) l_env->l_authp, (ub4) OCI_HTYPE_SESSION,(dvoid *) user, (ub4) strlen((char *)user),(ub4) OCI_ATTR_USERNAME, l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
retcode = OCIAttrSet((dvoid *) l_env->l_authp, (ub4) OCI_HTYPE_SESSION,(dvoid *) pass, (ub4) strlen((char *)pass),(ub4) OCI_ATTR_PASSWORD, l_env->l_errhp);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
//4。连接目标数据库
retcode = OCISessionBegin ( l_env->l_svchp, l_env->l_errhp, l_env->l_authp, OCI_CRED_RDBMS,(ub4) OCI_DEFAULT);
if(checkerr(l_env->l_errhp,retcode,outmsg)!=0)
{
//释放已创建资源,返回错误信息
ictora_free_env(l_env);
return NULL;
}
return l_env;
}
...全文
511 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yihaijun 2014-08-23
  • 打赏
  • 举报
回复
为什么结贴,你用哪种方式解决的?
yihaijun 2014-08-16
  • 打赏
  • 举报
回复
请修改操作系统 ulimit -n参数,我这边把ulimit -n改小很容易重现 我认为虽然这个参数是对一个进程限制,但手动启的程序或用system启的进程都属于同一个父进程

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧