快速业务通道

Linux进程通信 共享内存

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-30

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

1.概述

共享内存是进程通信的一种方式.此方式会开辟一部分可以被多个进程共享访问的物理内存区域.进行通信的多个进程分别将该内存区域映射到自己的虚拟地址空间,则这些进程就可直接访问共享内存,从而达到通信的目的.这种方法进程间共享数据时最快,一个进程修改共享内存的数据后,其他进程可以立即看到.

2 通信步骤

头文件

#include<sys/ipc.h>

#include<sys/shm.h>

<1>创建共享内存

int shmget(key_t key, int size,int shmflg);

Shmget()用来取得参数key所关联的共享内存标识号.若key为IPC_PRIVATE则会创建新的共享内存,大小有size决定.若key不为IPC_PRIVATE,也不是已建立的共享内存,则会根据shmflg决定.

参数:key 0/IPC_PRIVATE

size 内存大小

shmflg 旗标位

返回值:成功返回共享内存识别id,失败返回-1,错误存储在errno中

<2>连接到共享内存

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

shmat()用来将参数shmid所指的共享内存和目前的进程连接.

参数:shmid 与连接的共享内存标识码

shmaddr 0 内核自动选择一个地址

shmaddr 不为0且shmflg未指定SHM_RND,以shmaddr为连接地址

shmaddr 不为0但shmflg指定SHM_RND,shmaddr会调整为SHMLBA整数倍

返回值:成功返回已连接地址,失败返回-1,错误存储在errno中

<4>断开连接

int shmdt(const void *shmaddr);

shmdt()使当前进程与共享内存断开连接

参数:shmaddr为先前shmat()返回的共享内存地址

返回值 成功返回0,失败返回-1,错误存储在errno中

<3>对共享内存进行操作

int shmctl(int shmid,int cmd,struct shmid_ds *buf);

shmctl()提供了几种控制共享内存的方式

参数:shmid 为共享内存的标识码

cmd 如下

IPC_STAT 得到共享内存的状态,

  IPC_SET 改变共享内存的状态   

IPC_RMID 删除共享内存

struct shmid_ds *buf是一个结构体指针.IPC_STAT的时候,取得的状态放在这个结构体中.如果要改变共享内存的状态,用这个结构体指定.

返回值 成功返回0,失败返回-1,错误存储在errno中

举例

创建一个共享内存,子进程写入HelloWorld,由父进程读出

  1. #include<sys/types.h>
  2. #include<sys/ipc.h>
  3. #include<sys/shm.h>
  4. #include<stdio.h>
  5. #include<sys/stat.h>
  6. #include<stdlib.h>
  7. #define KEY 1234
  8. #define SIZE 2048
  9. int main()
  10. {
  11. pid_t pid;
  12. int shmid; /*共享内存ID*/
  13. char * shmaddr; /*连接地址*/
  14. struct shmid_ds buf;
  15. shmid=shmget(KEY,SIZE,IPC_CREAT|0600);/*建立共享内存*/
  16. pid=fork();
  17. if(pid<0)
  18. {
  19. perror("fork error!\n");
  20. exit(0);
  21. }
  22. if(pid==0)/*子进程将"Hello world!\n写入共享内存"*/
  23. {
  24. shmaddr=shmat(shmid,NULL,0);/*子进程与共享内存连接*/
  25. sprintf(shmaddr,"Hello world!\n");/*写入共享内存*/
  26. printf("Messgae have been write to shared memory!\n");
  27. shmdt(shmaddr);/*断开子进程与共享内存的连接*/
  28. exit(0);
  29. }
  30. sleep(3);/*待子进程结束*/
  31. shmctl(shmid,IPC_STAT,&buf);/*共享内存状态存入buf中*/
  32. shmaddr=(char *)shmat(shmid,NULL,0);/*父进程与共享内存连接*/
  33. printf("Message in shared memory:%s\n",shmaddr);/*输出共享内存数据*/
  34. shmdt(shmaddr);/*断开父进程与共享内存的连接*/
  35. shmctl(shmid,IPC_RMID,NULL);/*删除共享内存*/
  36. }

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号