欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


LLsMP系列教程之二:添加站点建立网站方法
.Net 垃圾回收和大对象处理 内存碎片整理
win7桌面被误删的快捷方式怎么找回来
StartOS系统特色功能介绍
win7无法进入睡眠模式怎么解决
win7怎么设置才能不产生本地浏览记录
win7纯净版关机和重启速度的优化方法
win7怎么禁止桌面生成快捷方式图标
LLsMP系列教程之一:Debian安装LLsMP环境教程
win7 oracle10g安装图解
Linux 进程间通讯共享内存方式
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

  共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。

  共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。

  共享内存实现步骤:

  一、创建共享内存,使用shmget函数。

  二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

  创建共享内存shmget:

  intshmget(key_t key, size_t size, int shmflg)

  功能:得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。

  key: 0(IPC_PRIVATE)会建立共享内存对象

  size:大于0的整数,新建共享内存的大小,以字节为单位。只获取共享内存时,指定为0.

  shmflg:

  0表示取共享内存标识符,如不存在则函数会报错;

  IPC_CREAT,如果内核中不存在键值与key相等的共享内存时,则创建一个共享内存;如果存在这样的共享内存则返回共享内存的标识符;

  IPC_CREAT|IPC_EXCL: 如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错;

  函数返回值:成功则返回内存的标识符;出错则返回-1,错误原因存在于error中

  映射共享内存到调用进程的地址空间shmat:

  void*shmat(int shmid, const void *shmaddr, int shmflg)

  msqid:共享内存标识符

  shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。

  shmflg: SHM_RDONLY 只读模式,其他为读写模式

  函数返回值:成功则返回附加好的共享内存地址;出错返回-1,错误原因存在于error中

  断开共享内存连接shmdt:

  intshmdt(const void *shmaddr)

  功能:传入shmaddr,连接共享的内存起始地址;断开成功则返回0,出错则返回-1,错误原因存在于error中。

  父子进程间通讯实例:

  #include

  #include

  #include

  #include

  #include

  #include

  int main(int argc, char **argv){

  if(argc< 2){ //需要输入共享的数据

  printf("pleaseinput the shared data.n");

  exit(-1);

  }

  intshmid;

  shmid= shmget(0,1024,IPC_CREAT);

  if(shmid== -1){ // 申请共享内存失败

  printf("createshare memory failed.n");

  exit(-1);

  }

  if(fork()){ // 父进程之中

  char*p_shmaddr;

  p_shmaddr= shmat(shmid, NULL, 0); // 映射到父进程之中的一个地址

  memset(p_shmaddr,0, 1024); // 初始化共享内存

  strcpy(p_shmaddr,argv[1]); // 拷贝共享数据到共享内存

  wait(NULL); //等待子进程结束

  exit(0);

  }

  else{

  sleep(2); //等待父进程写入数据

  char*c_shmaddr;

  c_shmaddr= shmat(shmid,NULL,0); // 映射到子进程之中一个地址,具体由kernel 指配

  printf("theshare data is: %sn", c_shmaddr); //子进程输出共享的数据

  exit(0);

  }

  }

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号
淳安分站 淳安分站