鸿 网 互 联 www.68idc.cn

调用共享内存的方法《精通Unix下C语言编程与项目实践》之八推荐

来源:互联网 作者:佚名 时间:2018-01-22 09:16
文章试读不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。一、二、三、四职场规划:一些杂七杂八的职场感悟吧。不值钱的软件人才 精力充沛与事业成功 让系分来得更猛烈些吧 不值钱的系统分析师 经济危机下大学生如何就业
文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。一、二、三、四 职场规划:一些杂七杂八的职场感悟吧。不值钱的软件人才 精力充沛与事业成功  让系分来得更猛烈些吧  不值钱的系统分析师  经济危机下大学生如何就业 我的诗歌:都是我的打油诗,但是很值得一读。不要工作还衣食无忧之四难歌  香格里拉美人图 宝宝图片:超可爱的小宝宝 写博客 考试培训:主要是关于考研、软考和等级的相关题解。2009考研试题分析   2008年12月程序员试题分析   2009年软考备考全攻略  2008年5月程序员试题解析   《精通Unix下C语言编程与项目实践》之八 共享内存的系统调用  作者:朱云翔,胡平 14.2.1 共享内存的系统调用 共享内存的基本系统调用包括创建共享内存、映射共享内存和释放共享内存映射三种,分别由函数shmget、函数shmat和函数shmdt完成。 1. 共享内存的创建 在Unix中,可以使用函数shmget来创建或获取共享内存,它的原型如下: #include  sys/shm.h int shmget (key_t key, size_t size, int shmflg); 函数shmget创建一个新的共享内存,或者访问一个已经存在的共享内存。参数key是共享内存的关键字。size指定了该共享内存的字节大小。参数shmflg的含义与消息队列函数msgget中参数msgflg的含义相类似。它的低9位决定了共享内存属主、属组和其它用户的访问权限,取值与表6-4的文件权限参数类似,但执行权限无意义。它的其它位指定了共享内存的创建方式,其取值与含义如表14-1所示: 表14-1 消息队列创建方式参数
与宏IPC_CREAT一起使用,单独使用无意义,此时只能创建一个不存在的共享内存,如果内存已存在,则调用失败。 与消息队列类似,当参数key的取值为IPC_PRIVATE时,将创建关键字为0的共享内存,Unix内核可以同时存在多个关键字为0的共享内存。 函数shmget调用成功时,返回共享内存的标识符,否则返回-1。 例1. 创建关键字为0x1234,访问权限为0666,占用空间10K的共享内存,如果已存在则返回其标识号。 int shmid; shmid = shmget(0x1234, 10*1024, 0666|IPC_CREAT); 例2. 创建关键字为0x1234,访问权限为0666,占用空间10K的共享内存,如果已存在则报错。 int shmid; shmid = shmget(0x1234, 10*1024, 0666|IPC_CREAT|IPC_EXCL); 2. 共享内存的映射 与消息队列和信号量不同,共享内存在获取标识号后,仍需调用函数shmat将共享内存段映射到进程地址空间后才可以访问。函数shmat的原型如下: #include  sys/shm.h void *shmat(int shmid, const void *shmaddr, int shmflg); 函数shmat将标识号为shmid共享内存映射到调用进程的地址空间中,映射的地址由参数shmaddr和shmflg共同确定,其规则为: (1) 如果参数shmaddr取值为NULL,系统将自动确定共享内存链接到进程空间的首地址。 (2) 如果参数shmaddr取值不为NULL且参数shmflg没有指定SHM_RND标志,系统将使用地址shmaddr链接共享内存。 (3) 如果参数shmaddr取值不为NULL且参数shmflg指定了SHM_RND标志位,系统将地址shmaddr对齐后链接共享内存。其中选项SHM_RND的意思是取整对齐,常数SHMLBA代表了低边界地址的倍数,公式“shmaddr - (shmaddr % SHMLBA)”的含义是将地址shmaddr移动到低边界地址的整数倍上。 以上规则可归纳如表14-2所示: 表14-2 共享内存地址映射规则
网友评论
<