免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-29 14:25 |只看该作者 |倒序浏览
我把代码贴以下吧


  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


编译成32位的代码运行都没问题,但只要编译成64位的,共享内存的地址可以取到,可是一访问就会core,再编译成32位的还是没问题,环境是hp-ux 11.11

论坛徽章:
0
2 [报告]
发表于 2005-09-29 14:29 |只看该作者

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

大虾们救救我啊

论坛徽章:
0
3 [报告]
发表于 2005-09-29 16:19 |只看该作者

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

顶!!

论坛徽章:
0
4 [报告]
发表于 2005-09-29 16:50 |只看该作者

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

64位的要特别注意include问题

论坛徽章:
0
5 [报告]
发表于 2005-09-29 17:11 |只看该作者

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

楼上的说详细一点呀

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-09-29 18:02 |只看该作者

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

建议
man shmget, man shmat等函数,
看是不是有需要注意的地方。

论坛徽章:
0
7 [报告]
发表于 2005-09-29 18:07 |只看该作者

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

试试看下面的.


  1. typedef struct ipc_struct {
  2. char pad[1];
  3. int value;
  4. }IPC;

  5. SHMID=shmget(IPC_KEY,sizeof(IPC)*1000,IPC_CREAT|0666);
  6. if(SHMID<0)
  7.   perror("shmget");

  8. IPC *SHMCOREID=NULL;
  9. SHMCOREID=(IPC *)shmat(SHMID,0,0);
  10. if(SHMCOREID==NULL)
  11. {
  12.     sprintf(errmsg,"%s","初始化共享内存失败");
  13.    return -1;
  14. }

复制代码

论坛徽章:
0
8 [报告]
发表于 2005-09-29 18:10 |只看该作者

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

感谢楼上的提醒,不过偶看了好多遍了,看不出啥问题,32位的为啥没问题呢

论坛徽章:
0
9 [报告]
发表于 2005-09-29 20:07 |只看该作者

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

我给你乘了1000的原因是有的操作系统对共享内存分配有下限.
另外也可能你越界访问. 或者是其他的原因.

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

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

55555555555,问题还没解决,机器的操作系统是-PA-RISC1.1,编译成32位没有问题,而且其他部分编译成64位也没有问题,就共享内存这块搞不定,是不是需要调整机器的内核参数阿,期盼牛人赐教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP