欢迎来到天天文库
浏览记录
ID:44714859
大小:100.01 KB
页数:26页
时间:2019-10-25
《Linux通信代码实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux进程间通信--共享内存方式(含例子)2008-07-2215:04共享内存实现分为两个步骤:一、创建共享内存,使用shmget函数。二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数由于这种方式是直接对用户空间的内存进行映射,故效率较高,使用起来也方便;但需要注意的是,多个进程并发访问共享内存时的同步控制问题,可用信号量操作解决。系统调用:shmget();原型:intshmget(key_tkey,intsize,intshmflg); 返回值:如果成功,返回共享内存段标识符。 如果失败,则返回-1:
2、 errno=EINVAL(无效的内存段大小) EEXIST(内存段已经存在,无法创建) EIDRM(内存段已经被删除) ENOENT(内存段不存在) EACCES(权限不够) ENOMEM(没有足够的内存来创建内存段)函数中的key_t如何获得已经在上一篇文章中说明了系统调用:shmat();原型:intshmat(intshmid,char*shmaddr,intshmflg); 返回值:如果成功,则返回共享内存段连接到进程中的地址。 如果失败,则返回-1: err
3、no=EINVAL(无效的IPCID值或者无效的地址) ENOMEM(没有足够的内存) EACCES(存取权限不够)当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。系统调用:shmdt();调用原型:intshmdt(char*shmaddr); 返回值:如果失败,则返回-1: errno=EINVAL(无效的连接地址)举例:shm1.c#include#include#include#include#include
4、#include#include#include#include#includeintmain(){ key_tipckey; intshmid; inti; char*addr_c; charsrcbuf[8]="abcdefg"; ipckey=ftok("/home/yds/tmp/shmipc",0); shmid=shmget(ipckey,1024,IPC_CREAT
5、0666); if(s
6、hmid==-1) { printf("creatshmerror!"); return-1; } addr_c=(char*)shmat(shmid,0,0); if((int)addr_c==-1) { printf("attachshmerror!"); return-1; } while(1) { for(i=0;i7、 strcpy(addr_c,srcbuf); sleep(1); } shmdt(addr_c); return0;}shm2.c#include#include#include#include#include#include#include#include#include#includeintmain(){key_ti8、pckey;intshmid;inti;char*addr_c;ipckey=ftok("/home/yds/tmp/shmipc",0);shmid=shmget(ipckey,1024,IPC_CREAT9、0666);if(shmid==-1){printf("creatshmerror!");return-1;}addr_c=(char*)shmat(shmid,0,0);if((int)addr_c==-1){printf("attachshmerror!");return-1;}while(1){sleep(2);printf("st10、ring(shm)is:%s",addr_c);}shmdt(addr_c);return
7、 strcpy(addr_c,srcbuf); sleep(1); } shmdt(addr_c); return0;}shm2.c#include#include#include#include#include#include#include#include#include#includeintmain(){key_ti
8、pckey;intshmid;inti;char*addr_c;ipckey=ftok("/home/yds/tmp/shmipc",0);shmid=shmget(ipckey,1024,IPC_CREAT
9、0666);if(shmid==-1){printf("creatshmerror!");return-1;}addr_c=(char*)shmat(shmid,0,0);if((int)addr_c==-1){printf("attachshmerror!");return-1;}while(1){sleep(2);printf("st
10、ring(shm)is:%s",addr_c);}shmdt(addr_c);return
此文档下载收益归作者所有