- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。 Linux下共享内存工具 共享内存的使用,有以下几个常用调用:ftok、shmget、shmat、shmdt及shmctl。 (1)用ftok()函数获得一个ID号。 key_t ftok(const char *pathname, int proj_id); pathname一定要在系统中存在并且进程能够访问;proj_id是一个1-255之间的一个整数值。 当成功执行的时候,返回一个key_t,否则返回-1。可以使用strerror(errno)来确定具体的错误信息。 Linux下共享内存工具 (2)shmget()用来开辟/指向一块共享内存的函数。 说明:shmget用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。 原型:int shmget(key_t key, size_t size, int shmflg); key_t key是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。如果两个进程没有任何关系,所以就用ftok()算出来一个标识符(或者自己定义一个)使用。 Linux下共享内存工具 int size 是这块内存的大小。 int flag 是这块内存的模式(mode)以及权限标识。 创建共享内存时,shmflg参数至少需要 IPC_CREAT | 权限标识,如果只有IPC_CREAT,则申请的地址都是 0xffffffff,不能使用; 获取已创建的共享内存时,shmflg不要只用IPC_CREAT(要有创建共享内存时的权限标识),否则在某些情况下,比如用ipcrm删除共享内存后,用该函数并用IPC_CREAT参数获取一次共享内存(会获取失败),则即使再次创建共享内存也不能成功,此时必须更改key来重建共享内存。 Linux下共享内存工具 (3)shmat()将这个内存区映射到本进程的虚拟地址空间。 原型: void *shmat(int shmid, char *shmaddr, int shmflag ); shmat用来允许本进程访问一块共享内存的函数。attach int shmid是那块共享内存的ID。 char * shmaddr是共享内存的起始地址,如果shmaddr为0,内核会把共享内存映像到调用进程的地址空间中的选定位置;如果shmaddr不为0,会把共享内存映像到shmaddr指定的位置。所以一般把shmaddr设为0。 Linux下共享内存工具 int shmflag是本进程对该内存的操作模式。 如果是SHM_RDONLY的话,就是只读模式。其它是读写模式 成功时,返回共享内存的起始地址。失败时返回-1。 Linux下共享内存工具 (4)shmdt()函数删除(分离)本进程对这块内存的使用,shmdt与shmat相反,是用来禁止本进程访问一块共享内存的函数。detach 原型:int shmdt( char *shmaddr );参数char *shmaddr是那块共享内存的起始地址。(shmat返回的地址) 成功时返回0。失败时返回-1。 Linux下共享内存工具 (5)shmctl() 控制对这块共享内存的使用。 原型: Int shmctl(int shmid,int cmd,struct shmid_ds *buf); int shmid是共享内存的ID。 int cmd是控制命令,可取值如下: IPC_STAT 得到共享内存的状态 IPC_SET 改变共享内存的状态 IPC_RMID 删除共享内存 struct shmid_ds * buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。 Linux下共享内存工具 注意:使用共享内存,在结束程序退出后,如果没在程序中用shmctl()删除共享内存的话,一定要在命令行下用 ipcrm命令删除这块共享内存。要是不管的话,它就一直在那儿放着了。 Linux下共享内存工具 shmid_ds数据结构表示每个新建的共享内存。当shmget()创建了一块新的共享内存后,返回一个可以用于引用该共享内存的shmid_ds数据结构的标识符。在include/linux/shm.h中定义。struct shmid_ds { s
文档评论(0)