- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux下多值信号量的操作探讨
摘要:本文简单介绍了Linux下信号量通信机制的发展历史,信号量通信的特点,主要针对信号量的操作进行分析,其中包括创建信号量集合,修改信号量集合中某个信号量的值,如何获得信号量集合中某个信号量的值。文章最后给出多值信号量操作的实例,并且指出多值信号量操作时应该关注的重点问题。
关键词:信号量 进程间通信 操作
中图分类号:TP368.1 文献标识码:A 文章编号:1007-9416(2016)10-0240-01
1 Linux信号量通信机制发展史
Linux操作系统中有多种进程间通信方式。本文主要围绕信号量这种进程间通信方式进行阐述。信号量的概念最早由荷兰学者Edsger Dijkstra于1965年提出,目前已经发展成一种卓有成效的进程间通信机制。通过该机制可以有效的控制两个进程对共享资源的同步访问操作。
2 Linux单值信号量的操作
当信号量集合中只有一个信号量的时候,可以直接调用函数semop(int semid, struct sembuf *opsptr, size_t nops)来完成操作。其中第一个参数semid是信号量集合的标识符,即semget函?抵葱谐晒?后的返回值;第二个参数opsptr比较复杂,是struct sembuf类型的结构体,该结构体与我们对信号量的操作紧密相关。结构体原型为struct sembuf {short sem_num; short sem_op; short sem_flg; };有三个属性,第一个属性sem_num为信号量在信号量集合中的编号;第二个属性sem_op为当前信号量需要改变的值,如果该属性为正值,则在当前信号量基础之上增加sem_op,如果该属性为负值,则在当前信号量值的基础上减去sem_op,第三个属性为标志位,当取值为SEM_UNDO时,表示进程结束后由内核释放信号量发生改变的值。semop函数中的第三个参数表示对该信号量操作的次数。如果对该信号量操作一次,则参数nops取值为”1”,如果要操作两次,则该参数取值为”2”。如果要对某个信号量做多次操作的时候,需要把相关的操作封装到struct sembuf类型的数组中,即定义一个数组struct sembuf opbuf[2],然后对数组进行赋值opbuf[0].sem_num=0;opbuf[0].sem_op=1;opbuf[0].sem_flg=IPC_NOWAIT,这些数值表示对信号量集合中的第一个信号量进行加”1”操作,因为需要对该信号量进行两次操作,所以还需要对数组opbuf中的第二个元素进行赋值操作,即opbuf[1].sem_num=0;opbuf[1].sem_op=1;opbuf[1].sem_flg=IPC_NOWAIT。表示对信号量集合中的第一个信号量再次做加”1”操作。此时参数opstr取值为opbuf。
Semctl函数用来对信号量集合的属性进行操作。原型为semctl(int semid,int semnum,int cmd,../* union semun arg */);第一个参数semid为信号量集标识符,即semget的返回值,第二个参数semnum对应信号量在信号集合中的编号,第三个参数cmd是需要我们关注的参数,该参数与semctl函数完成的功能紧密相关,第四个参数是一个联合类型的变量,该变量中的值主要根据参数cmd的变化而发生改变。如果要得到单个信号量集合中的信号量的值,只需要给参数cmd赋值为GETVAL即可,此时,完全可以把第四个参数忽略掉。int semValue1=semctl(sem_id, 0, GETVAL);这行代码就表示得到标识符为sem_id的信号量集合中的编号为0的信号量的值,并且把该值保存在int类型的变量semValue1中。
3 Linux多值信号量的操作
如果信号量集合中有多个信号量,则需要分别调用代码int semValue1=semctl(sem_id, 0,GETVAL)多次。由此可见这种方式代码重复性较高,也比较麻烦。能否找到一种简单的方法直接得到该信号量集合中的所有信号量的值?答案是肯定的。这个时候需要用到semctl函数中的第四个参数,即union semun{int val;struct semid_ds *buf;ushort *array;struct seminfo *__buf; };需要先在代码中声明一下这个类型,然后定义此类型的变量,例如union semun semarg;再定义一个unsigned short 类型的数组,代码为unsigned shortreturnvalue[2]={0,0};该数组用来存放取出
您可能关注的文档
最近下载
- 2024年嘉定区区属国有企业秋季专场招聘笔试备考试题及答案解析.docx VIP
- 刮痧(精简版)PPT课件.pptx VIP
- 宝玉石行业操作人员安全培训.pptx VIP
- 小学生数学跨学科主题学习的实施教学研究课题报告.docx
- 执行董事监事一名公司新版章程.doc VIP
- 跨海大桥防腐蚀技术专题.pptx
- 关于舆论的基本理念_陈力丹.pdf VIP
- 2025年高考备考高中历史 之隋唐时期 附答案.pdf VIP
- 大学英语四级写作一大英语四级写作一.ppt VIP
- 2024年新人教版英语七年级上册全册课件 Unit 7 第一课时 Section A 1a-pronunciation.pptx VIP
文档评论(0)