共享存储区通信实例及分析

在读apue的时候,共享存储区的讲解并没用实例,为此自己写了一个小程序,程序粗创建子进程,由子进程从终端接收字符串存入共享区,转载请尊重原创、保留相关链接本文来自多宝平台http://www.mbodb.com
父进程从共享区读出字符串并输出。同时,父子进程均输出各自的共享区的地址区间 区间。

点击(此处)折叠或打开

  1. #include "apue.h"
  2. #include <sys/shm.h>
  3. #define SHM_SIZE 100000//共享存储区长度
  4. #define SHM_MODE 0600//共享存储区默认访问权限
  5. int
  6. main(void)
  7. {
  8.   int shmid,pid;
  9.   char* shmptr;
  10.   key_t key;
  11.   if(key=ftok("sharem.c",1)==-1) //使用ftok创建相应的key
  12.     printf("ftok error\n");
  13.   if((shmid=shmget(key,SHM_SIZE,IPC_CREAT|SHM_MODE))==-1)
  14.     printf("shmget error\n");
  15.   if((pid=fork())<0)
  16.     printf("fork error\n");
  17.   else if(pid==0)//子进程,从终端接收字符串存入共享存储区
  18.   {
  19.     if((shmptr=shmat(shmid,0,0))==(void*)-1)
  20.         printf("child shmat error\n");
  21.     printf("child share memory attached from %lx to %lx\n",(unsigned long)shmptr,(unsigned long)shmptr+SHM_SIZE);//输出共享存储区在子进程中的地址区间
  22.        printf("child input:");
  23.     scanf("%s",shmptr);
  24.    exit(0);
  25.   }
  26.   else//父进程,从共享存储区读出字符串输出到终端
  27.   {
  28.     sleep(5);
  29.     if((shmptr=shmat(shmid,0,0))==(void*)-1)
  30.         printf("parent shmat error\n");
  31.     printf("parent share memory attached from %lx to %lx\n",(unsigned long)shmptr,(unsigned long)shmptr+SHM_SIZE);//输出共享存储区在父进程中的地址区间
  32.        printf("parent output:");
  33.     printf("%s\n",shmptr);
  34.   }
  35.   exit(0);
  36. }
  37. //注:本程序为了是程序简洁,并没有采用信号量或者记录锁来保证共享区的同步访问,多宝而是采用让父进程等待5秒钟来保证子进程先执行。
运行结果:

分析:共结果可发现,父子进程的共享区区间地址相同,根据apue的说明,此处可能使用了“匿名存储映射 ”技术,但是不能认为共享存储区在不同的进程中地址都相同,这 仅是在父子进程中。在不同进程中,可能将共享区
连接到不同的地址,所以当在共享区中存入指针类型时,绝不会存放实际物理地址,相反,指针值设置为段内另一对象的偏移量,偏移量为所指对象的实际地址减去共享存储区的起始地址。
另外:通过执行ipcs命令可以发现,当程序结束后,共享存储区依然还在。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值