共享内存

共享内存实现分为两个步骤:
1.创建共享、打开共享内存,使用shmget函数
2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
3. 分离共享内存
4. 控制、删除共享内存


下面介绍共享内存要用到的函数:

shmget

函数作用:在内核中创建内存

函数原型:int shmget ( key_t key, int size, int shmflg )

函数参数:key 键值   IPC_PRIVATE 私有的键值

  size:创建内存大小

  shmflg:标志,同open权限

返回值:成功共享的内存标识符;出错-1

头文件:#include<sys/opc.h>

      #include <sys/shm.h>


shmat

函数作用:映射共享内存,映射到各自内存空间

函数原型:char * shmat ( int shmid, char *shmaddr, int flag)

函数参数:shmid:内存的标识符

  shmaddr:映射共享内存到本进程的指定地址,若为NULL,则由内核进行自动分配

  flag:0(默认)可读写;SHM_RDONLY,只读

返回值:被映射的段地址,出错-1

头文件:#include<sys/types.h>

      #include<sysy/ipc.h>

      #include<sys/shm.h>


shmdt

函数作用:撤销共享内存的映射

函数原型:int shmdt(const void *shmaddr)

函数参数:shmaddr:被映射的共享内存地址

返回值:成功0,出错-1


下面是例子:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <errno.h>  
  5. #include <unistd.h>  
  6. #include <sys/stat.h>  
  7. #include <sys/types.h>  
  8. #include <sys/ipc.h>  
  9. #include <sys/shm.h>  
  10.   
  11. #define PERM S_IRUSR|S_IWUSR  
  12. /* 共享内存 */  
  13.   
  14. int main(int argc,char **argv)   
  15. {   
  16.     int shmid;   
  17.     char *p_addr,*c_addr;   
  18.       
  19.     if(argc!=2)   
  20.     {   
  21.         fprintf(stderr,"Usage:%s\n\a",argv[0]);   
  22.         exit(1);   
  23.     }  
  24.   
  25.     /* 创建共享内存 */      
  26.     if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)   
  27.     {   
  28.         fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));   
  29.         exit(1);   
  30.     }   
  31.   
  32.     /* 创建子进程 */  
  33.     if(fork()) // 父进程写  
  34.     {   
  35.         p_addr=shmat(shmid,0,0);   
  36.         memset(p_addr,'\0',1024);   
  37.         strncpy(p_addr,argv[1],1024);  
  38.         wait(NULL); // 释放资源,不关心终止状态  
  39.         exit(0);   
  40.     }   
  41.     else       // 子进程读  
  42.     {   
  43.         sleep(1); // 暂停1秒         
  44.         c_addr=shmat(shmid,0,0);   
  45.         printf("Client get %s\n",c_addr);   
  46.         exit(0);   
  47.     }   
  48. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值