资源描述:
《利用共享内存实现进程间通信--简单剪贴板实例.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、利用共享内存实现进程间通信在两个进程间共享数据的方法,至今为止我们只说过利用管道。管道只是利用了输入输出重定向的原理,非常简单。而且只能在父子进程间使用。很多场合下这种方法是无法满足我们的要求的。那么现在,我们又有了一种新的方法——利用共享内存(sharedmemory)。这可以使我们在任意两个进程间传递数据,而且也是相对简单容易实现的一个方法。注意:在正常情况下,一个进程的所使用的内存区是不允许其它进程访问的。这里我们要开辟的共享内存是例外。我们来做一个简单的剪贴板。从标准输入向mcut输入数据,mcut将其放在共享内存中,然后mpaste从共
2、享内存中读出数据并显示。#include#include#include#includeintmain(){key_tshmkey;intshmid,in_tmp;char*head,*pos,in_data[4096],*in_ptr;shmkey=ftok("mcut",'a');//计算标识符//shmid开辟共享内存shmid=shmget(shmkey,sizeof(in_data),IPC_CREAT
3、0666);head=pos=shmat(sh
4、mid,0,0);//允许本进程使用这块共享内存in_ptr=in_data;//开始从标准输入输入数据,暂时存在in_data里。while((in_tmp=getchar())!=EOF){*in_ptr=in_tmp;in_ptr++;}*in_ptr=' ';in_ptr=in_data;//开始写入共享内存while(*in_ptr!=' '){*pos=*in_ptr;pos++;in_ptr++;}*pos=' ';shmdt(head);//禁止本进程使用这块内存return0;}#include#
5、include#include#includeintmain(){key_tshmkey;intshmid;char*head,*pos,out_data[4096],*out_ptr;shmkey=ftok("mcut",'a');//计算标识符//开辟共享内存shmid=shmget(shmkey,sizeof(out_data),IPC_ALLOC
6、0666);head=pos=shmat(shmid,0,0);//允许本进程使用这块共享内存out_ptr=out_data;//
7、从共享内存中取得数据while(*pos!=' '){*out_ptr=*pos;out_ptr++;pos++;}*out_ptr=' ';printf("%s",out_data);fflush(stdout);shmdt(head);//禁止本进程使用这块共享内存return0;}如何?明白多少了?要使用共享内存,应该有如下步骤:1.开辟一块共享内存shmget()2.允许本进程使用共某块共享内存shmat()3.写入/读出4.禁止本进程使用这块共享内存shmdt()5.删除这块共享内存shmctl()或者命令行下ipcrm上面的程
8、序中用到了如下函数,我们一一解释一下。首先是ftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。其次,操作共享内存,我们用到了下面的函数#include#include#includeintshmget(key_tshmkey,intshmsiz,intflag);void*shmat(intshmid,
9、char*shmaddr,intshmflag);intshmdt(char*shmaddr);shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:key_tshmkey是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。但是刚才我们的两个进程没有任何关系,所以就用ftok()算出来一个标识符使用了。intshmsiz是这块内存的大小.intflag是这块内存的模式(mode)以及权限标识(关于权限的意思,请参阅本系列第五章)。模式可取如下值:新建:IPC_CREAT使用已开辟的内存:I
10、PC_ALLOC如果标识符以存在,则返回错误值:IPC_EXCL然后将“模式”和“权限标识”进行“或”运算,做为第三个参数。如:IPC_