共享内存是系统出于多个进程之间通讯的考虑

共享内存是系统出于多个进程之间通讯的考虑

ID:39636745

大小:79.00 KB

页数:14页

时间:2019-07-07

共享内存是系统出于多个进程之间通讯的考虑_第1页
共享内存是系统出于多个进程之间通讯的考虑_第2页
共享内存是系统出于多个进程之间通讯的考虑_第3页
共享内存是系统出于多个进程之间通讯的考虑_第4页
共享内存是系统出于多个进程之间通讯的考虑_第5页
资源描述:

《共享内存是系统出于多个进程之间通讯的考虑》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。一、应用共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()。1)用ftok()函数获得一个ID号.应用说明:在IPC中,我们经常用用key_t的值来创建或者打开信号量,共享内存和消息

2、队列。函数原型:key_tftok(constchar*pathname,intproj_id);Keys:1)pathname一定要在系统中存在并且进程能够访问的3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。当成功执行的时候,一个key_t值将会被返回,否则-1被返回。我们可以使用strerror(errno)来确定具体的错误信息。考虑到应用系统可能在不同的主机上应用,可以直接定义一个key,而不用ftok获得:#defineIPCKEY0x3443782)shmge

3、t()用来开辟/指向一块共享内存的函数应用说明:shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。函数原型:intshmget(key_tkey,size_tsize,intshmflg);key_tkey是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。如果两个进程没有任何关系,所以就用ftok()算出来一个标识符(或者自己定义一个)使用了。intsize是这块内存的大小.intflag是这块内存的模式(mode)以及

4、权限标识。模式可取如下值:        IPC_CREAT新建(如果已创建则返回目前共享内存的id)IPC_EXCL  与IPC_CREAT结合使用,如果已创建则则返回错误然后将“模式”和“权限标识”进行“或”运算,做为第三个参数。如:   IPC_CREAT

5、IPC_EXCL

6、0640   例子中的0666为权限标识,4/2/1分别表示读/写/执行3种权限,第一个0是UID,第一个6(4+2)表示拥有者的权限,第二个4表示同组权限,第3个0表示他人的权限。这个函数成功时返回共享内存的ID,失败时返回

7、-1。关于这个函数,要多说两句。创建共享内存时,shmflg参数至少需要IPC_CREAT

8、权限标识,如果只有IPC_CREAT则申请的地址都是k=0xffffffff,不能使用;获取已创建的共享内存时,shmflg不要用IPC_CREAT(只能用创建共享内存时的权限标识,如0640),否则在某些情况下,比如用ipcrm删除共享内存后,用该函数并用IPC_CREAT参数获取一次共享内存(当然,获取失败),则即使再次创建共享内存也不能成功,此时必须更改key来重建共享内存。3)shmat()将这个内存区映

9、射到本进程的虚拟地址空间。函数原型:void   *shmat(intshmid,char*shmaddr,intshmflag);shmat()是用来允许本进程访问一块共享内存的函数。intshmid是那块共享内存的ID。char*shmaddr是共享内存的起始地址,如果shmaddr为0,内核会把共享内存映像到调用进程的地址空间中选定位置;如果shmaddr不为0,内核会把共享内存映像到shmaddr指定的位置。所以一般把shmaddr设为0。intshmflag是本进程对该内存的操作模式。如果是S

10、HM_RDONLY的话,就是只读模式。其它的是读写模式成功时,这个函数返回共享内存的起始地址。失败时返回-1。4)shmdt()函数删除本进程对这块内存的使用,shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。函数原型:intshmdt(char*shmaddr);参数char*shmaddr是那块共享内存的起始地址。成功时返回0。失败时返回-1。5)shmctl()控制对这块共享内存的使用函数原型:int    shmctl(intshmid,intcmd,structshm

11、id_ds*buf);intshmid是共享内存的ID。intcmd是控制命令,可取值如下:       IPC_STAT       得到共享内存的状态       IPC_SET        改变共享内存的状态       IPC_RMID       删除共享内存structshmid_ds*buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。返回值:       

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。