免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: GongWithTheWind
打印 上一主题 下一主题

快疯了!!!共享内存问题!!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-10-03 14:23 |只看该作者

快疯了!!!共享内存问题!!!

我把代码贴以下吧

  1. #include "ipc.h"
  2. #define MAXRESENDTIME 50
  3. static char CHECKMESSAGE[31];
  4. static long COREID=0;
  5. static int SHMID=0;
  6. static int SEMID=0;
  7. typedef struct Counter
  8.         {
  9.                 long value;
  10.         }COUNTER;

  11. /*******************************************************************************\
  12. *         函 数 名        :        IPC_INIT
  13. *         函数功能        :        初始化ipc,只有在调用V_的发送的时候才在程序的开始调用此函数
  14. *         编 程 者        :          高振华
  15. *         编写日期        :        2005.09.12
  16. *        输入参数        :       
  17.                                 :        errmsg:失败原因
  18.                                 :
  19. *        输出参数        :          
  20.                 :   如果失败则返回负值,并在errmsg里指明失败原因   
  21. *         修 改 者        :
  22. *         修改内容        :   
  23. *         修改日期        :       
  24.                            :  
  25.                 :       
  26. \*********************************************************************************/
  27. int IPC_INIT(char *errmsg)
  28. {
  29.         int ret=0;
  30.         COUNTER *SHMCOREID=NULL;
  31.         char CurrPath[255];
  32.         char ProcName[100];
  33.         key_t IPC_KEY;
  34.         int exist_flag=0;
  35.        
  36.         if(errmsg==NULL)
  37.         return -1;
  38.         if(SHMID>;0&&SEMID>;0)
  39.         {
  40.                 sprintf(errmsg,"%s","已初始化!");
  41.                 return 0;
  42.         }
  43.        
  44.        
  45.         memset(CurrPath,0,sizeof(CurrPath));
  46.         if(getcwd(CurrPath,254)==NULL)
  47.         {
  48.                 sprintf(errmsg,"%s","取得当前工作路径失败");
  49.                 return -1;
  50.         }

  51.         if(getCurrentProcName(ProcName)<0)
  52.         {
  53.             sprintf(errmsg,"%s","获取当前程序名称失败");
  54.                 return -1;
  55.         }
  56.         /*sprintf(ProcName,"%s",getCurrentProcName());*/
  57.         printf("=========ProcName=========[%s]\n",ProcName);
  58.         if(CurrPath[strlen(CurrPath)-1]!='/')
  59.         {
  60.                 strcat(CurrPath,"/");
  61.         }
  62.         sprintf(CurrPath,"%s%s",CurrPath,ProcName);
  63.        
  64.         printf("CurrPath===[%s]\n",CurrPath);
  65.         IPC_KEY=ftok(CurrPath,128);
  66.         if(IPC_KEY==-1)
  67.         {
  68.                 sprintf(errmsg,"%s","ftok转换失败");
  69.                 return -1;
  70.         }
  71.        
  72.         SHMID=shmget(IPC_KEY,sizeof(COUNTER)*10000,IPC_CREAT|0666|IPC_EXCL);
  73.         if(SHMID<0)
  74.         {
  75.                 if(errno==EEXIST)
  76.                 {
  77.                         printf("-----IPC已经被初始化------ \n");
  78.                         exist_flag=1;
  79.                 }
  80.                 else
  81.                 {
  82.                         perror("Creat Shm error!\n");
  83.                         sprintf(errmsg,"%s","Creat Shm error!");
  84.                         return -1;
  85.                 }
  86.         }
  87.        
  88.         /*取得共享内存*/
  89.         if(!exist_flag)
  90.         SHMID=shmget(IPC_KEY,sizeof(COUNTER)*10000,IPC_CREAT|0666);
  91.         else
  92.         SHMID=shmget(IPC_KEY,sizeof(COUNTER)*10000,0666);
  93.         if(SHMID<0)
  94.         {
  95.                 perror("Creat Shm error!\n");
  96.                 sprintf(errmsg,"%s","创建共享内存失败");
  97.                 return -1;
  98.         }
  99.        
  100.         SEMID=creat_semaphore(IPC_KEY,1);
  101.         if(SEMID<0)
  102.         {
  103.                 sprintf(errmsg,"%s","创建信号量失败");
  104.                 return -1;
  105.         }
  106.        
  107.         if(!exist_flag)
  108.         {
  109.                 ret=init_semaphore(SEMID,0,1);
  110.                 if(ret<0)
  111.                 {
  112.                         sprintf(errmsg,"%s","初始化信号量失败");
  113.                         return -1;
  114.                 }
  115.         }
  116.         /*初始化共享内存*/
  117.         if(!exist_flag)
  118.         {
  119.                 SHMCOREID=(COUNTER *)shmat(SHMID,0,0);
  120.                 if(SHMCOREID==NULL)
  121.                 {
  122.                         sprintf(errmsg,"%s","初始化共享内存失败");
  123.                         return -1;
  124.                 }
  125.                 locksem(SEMID,0);
  126.                 memset(SHMCOREID,0,sizeof(COUNTER)*10000);
  127.                 (SHMCOREID+9999)->;value=0;
  128.                 unlocksem(SEMID, 0);
  129.                 shmdt(SHMCOREID);
  130.         }
  131.        
  132.         sprintf(errmsg,"%s","初始化成功");
  133.         return 0;
  134. }
复制代码

上面是库函数的一部分,库的makefile
AR = ar
ARFLAGS = -rv
CC = cc -c -g +DA2.0w
#--------------------------------------------
libclient_SRCS=ipc.c
libclient_OBJS=ipc.o
libclient_TARGET = libIPC.a
#------------------------------------------
all : $(libclient_TARGET)
        rm *.o
#------------------------------------------
$(libclient_TARGET) : $(libclient_OBJS)
        rm -f $(libclient_TARGET)
        $(AR)  $(ARFLAGS)    $(libclient_TARGET)  $(libclient_OBJS)
#-------------------------------------------------------------------------


下面是调用库函数的main函数


  1. #include "tc.h"
  2. int main()
  3. {
  4.         int ret=0;
  5.         char desc[200];
  6.        
  7.         memset(desc,0,sizeof(desc));
  8.        
  9.         ret=IPC_INIT(desc);
  10.         if(ret<0)
  11.         {
  12.                 printf("IPC_INIT error!-->;%s\n",desc);
  13.                 return -1;
  14.         }
  15.         printf("IPC_INIT success!-->;%s\n",desc);
  16.         return 0;
  17. }
复制代码



makefile :
PROG=t
CC=cc +DA2.0w
objs=main.o


all(PROG)

$(PROG)(objs)
        $(CC) -g $(objs) -L /interlog/ipc -lIPC -o t
        rm *.o
test.o:main.c
        $(CC) -c -I$(HOME)/include main.c

论坛徽章:
0
12 [报告]
发表于 2005-10-07 15:23 |只看该作者

快疯了!!!共享内存问题!!!

gdb 看一下是core在什么地方了,应该是数据访问越界造成的. counter 里里的结构体 `long value' 在32位环境是为4bytes,在64下为8bytes,建议申请的空间在64位环境是按8bytes倍数申请,方便对齐.

论坛徽章:
0
13 [报告]
发表于 2005-10-07 16:36 |只看该作者

快疯了!!!共享内存问题!!!

今天没有HP64位的环境,明天帮你试一下

论坛徽章:
0
14 [报告]
发表于 2005-10-08 11:47 |只看该作者

快疯了!!!共享内存问题!!!

没有你的ipc.h,少了几个函数定义,试不了,sorry
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP