免费注册 查看新帖 |

Chinaunix

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

关于共享内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-18 16:24 |只看该作者 |倒序浏览
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/shm.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <openssl/buffer.h>
  8. #include <signal.h>

  9. #define SHM_MODE SHM_R|SHM_W|IPC_CREAT|0666
  10. struct message{
  11.    char name[10];
  12.    int age;
  13. };

  14. int main()
  15. {
  16.     struct message *mes;
  17.     struct message *p;
  18.     int shmid;
  19.     int ret;
  20.     pid_t pid;
  21.    // long *Local=0;
  22.    
  23.     mes=(struct message *)malloc(10*sizeof(struct message));
  24.     memcpy(mes[0].name,"abc",6);
  25.     mes[0].age=100;
  26.    
  27.     shmid=shmget(IPC_PRIVATE,10*sizeof(struct message),SHM_MODE);
  28.     if(shmid==-1)
  29.     {
  30.       printf("create shm error\n");
  31.       return -1;
  32.     }
  33.     p=(struct message *)shmat(shmid,NULL,0);
  34.     if(p==(struct message *)(-1))
  35.     {
  36.      error("shmat");
  37.      return -1;
  38.     }
  39.     memcpy(p,mes,sizeof(p));
  40.     printf("p[0].name=%s\n",p[0].name);
  41.     signal(SIGCHLD,SIG_IGN);
  42.     if((pid=fork())==0)
  43.     {
  44.        memcpy(p[1].name,"def",9);
  45.        printf("p[1].name=%s\n",p[1].name);
  46.        memcpy(mes,p,sizeof(mes));
  47.        printf("mes[1].name=%s\n",mes[1].name);
  48.        ret=shmdt((void *)p);
  49.        if(ret==-1)
  50.        {
  51.          fprintf(stderr,"shmdelete failed\n");
  52.          exit(1);
  53.        }
  54.        exit(0);
  55.     }
  56.     sleep(3);
  57.     printf("mes[0].name=%s\n",mes[0].name);
  58.     printf("mes[1].name=%s\n",mes[1].name);
  59.     ret=shmdt((void *)p);
  60.        if(ret==-1)
  61.        {
  62.          fprintf(stderr,"shmdelete failed\n");
  63.          exit(1);
  64.        }

  65. //   shmctl(shmid,IPC_RMID,NULL);
  66.     return -1;
  67. }
复制代码


为什么mes[1].name在父子进程中都显示不出来??

论坛徽章:
0
2 [报告]
发表于 2006-05-18 17:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2006-05-18 17:10 |只看该作者
我感觉你对共享内存的用法还没搞清楚。
另外,memcpy(p,mes,sizeof(p)); 中的 sizeof 也是错的

论坛徽章:
0
4 [报告]
发表于 2006-05-18 18:41 |只看该作者
原帖由 wenlek 于 2006-5-18 17:10 发表
仔细看看,你是不是copy错地方了memcpy(mes[0].name,"abc",6);仔细看看



不是这里的问题,是mes[1]中被赋的值没有显示出来
不清楚你所指的问题,请指教

论坛徽章:
0
5 [报告]
发表于 2006-05-18 18:46 |只看该作者
原帖由 莫愁 于 2006-5-18 17:10 发表
我感觉你对共享内存的用法还没搞清楚。
另外,memcpy(p,mes,sizeof(p)); 中的 sizeof 也是错的



不是取mes中的前sizeof(p)个字节赋给p么??

我这想实验的就是动态分配(栈中)与共享内存区中的值的交互??
请指教

论坛徽章:
0
6 [报告]
发表于 2006-05-18 18:58 |只看该作者
原帖由 buptkang 于 2006-5-18 18:46 发表



不是取mes中的前sizeof(p)个字节赋给p么??

我这想实验的就是动态分配(栈中)与共享内存区中的值的交互??
请指教

32 位机器上,sizeof(*p) 总是等于 4,不知道 4 是不是你想要的结果呢?

论坛徽章:
0
7 [报告]
发表于 2006-05-18 19:23 |只看该作者
原帖由 莫愁 于 2006-5-18 18:58 发表

32 位机器上,sizeof(*p) 总是等于 4,不知道 4 是不是你想要的结果呢?



确实是个问题,不过我改过后还是有问题,又检查了其它地方,还是原来的输出??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-05-18 19:29 |只看该作者
原帖由 buptkang 于 2006-5-18 19:23 发表



确实是个问题,不过我改过后还是有问题,又检查了其它地方,还是原来的输出??

从这里就可以看出你的水平比较菜,既然比较菜,
那么问题自然多多了。
建议你好好找个共享内存的例子看看,我也感觉你对共享内存的概念和用法都没有搞清楚。
网上找找有合适的例子,拣能够编译、运行的先试一下,然后试着改。

论坛徽章:
0
9 [报告]
发表于 2006-05-18 19:42 |只看该作者
原帖由 flw 于 2006-5-18 19:29 发表

从这里就可以看出你的水平比较菜,既然比较菜,
那么问题自然多多了。
建议你好好找个共享内存的例子看看,我也感觉你对共享内存的概念和用法都没有搞清楚。
网上找找有合适的例子,拣能够编译、运行的先试一 ...


不过这看了许多这方面的介绍了,论坛中像相关的帖子也都试着做了,不过问题依然存在!!??

论坛徽章:
0
10 [报告]
发表于 2006-05-18 20:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP