免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2233 | 回复: 3
打印 上一主题 下一主题

[C] 共享内存 shmdt 报错,不知为什么了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-24 15:25 |只看该作者 |倒序浏览
下面这段代码红字部分在redHat9下报段错误,没找出原因,哪位达人给指点指点,谢先啊。
同时,这段代码如果放在aix下编译运行并不报错,这就更让我迷惑了/  有哪些地方写错了吗

参数:name是传入的字符串

int isNameAlreadyExist(char *name)
{
       
        char  *shm = NULL , *p_Cur= NULL;
        int varBlockIndex = -1 ;/*作为返回值,记录保存时的首块索引*/
        int i=0 ,ret = -1;

        stShmManager *pManager = NULL  ;
        stShmItem *pItem = NULL ;

        shm = (char*)shmat(g_shmId,0,0);/*g_shmId是一个全局变量,由 shmget得到*/
        if ((int)shm == -1)
        {
                printf("连接共享内存错误.\n");
                shmdt(shm);
                exit(-1);
        }
        pManager = (stShmManager *)shm;       

        for(i = 0 ; i < pManager->varBlockCnt ; i++)
        {
                pItem = (stShmItem*)(shm + BLOCKSIZE*pManager->headerBlockCnt +i*BLOCKSIZE);
                if (0 == pItem->flag )       
                {
                        continue ;
                }
                else
                {
                        if (0 == pItem->subIndex)
                        {
                                if(strcmp(name,pItem->name)==0)
                                {       
                                        ret = pItem->index ;
                                        printf("shm = %d \n",shm);/*这句可以执行,shm的结果与*/
                                        shmdt(shm);/*在redHat9下本句报错,提示段错误。但在aix下本句可以通过,不知是什么原因??*/
                                        printf("428");
                                        return(ret);
                                }
                                else
                                {
                                        continue;
                                }
                        }
                        else
                        {
                                continue;
                        }
                }
        }
        if (i >= pManager->varBlockCnt)
        {
                shmdt(shm);
                return(-1);
        }
        shmdt(shm);
        return(-1);       
}

论坛徽章:
0
2 [报告]
发表于 2010-05-26 11:42 |只看该作者
printf("shm = %d \n",shm);
shmat 返回的是指针,不是整数

论坛徽章:
0
3 [报告]
发表于 2010-05-26 13:30 |只看该作者
下面这段代码红字部分在redHat9下报段错误,没找出原因,哪位达人给指点指点,谢先啊。
同时,这段代码如果 ...
explorewen 发表于 2010-05-24 15:25



    打印出来的shm和之前shmat返回的是相同的值吗?
加一个强制转换shmdt((const void*)shm);

论坛徽章:
0
4 [报告]
发表于 2010-06-11 15:31 |只看该作者
回复 3# huangwei0413

谢谢你的回复。shm的结果和shmat的返回值是相同的。

我找到原因了,原来在调用这个函数之间有个地方出错了(多写了一个%s),改过后,现在这个函数不报错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP