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