- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
信号量
信号量为了防止出现多个程序同时访问一个共享资源而引发的问题,需要采取一种机制,使得在任一时刻,只有一个进程可以访问到临界区域,即信号量机制信号量分类二进制信号量(二元信号量):取值为0、1通用信号量:取值可为0或任意正整数。
P操作:如果信号量的值大于0,就给它减1;如果信号量的值等于0,就挂起该进程的执行。PV操作V操作:如果有其他进程因等待信号量而被挂起,就让它恢复运行;如果没有进程因等待信号量而挂起,就给它加1。
可以这样看待信号量sv:当临界区可用时,信号量sv的值是true,然后P(sv)操作将它减1,使它变为false以表示临界区域正在被使用;当进程离开临界区域时,使用V(st)操作将它加1,使临界区域可以再被使用。信号量与一般变量对普通变量进行加减是不行的,因为在c/c++等语言中,没有一个原子操作可以完成变量检测和加减的功能。
以下几个函数用于处理信号量操作#includesys/types.h#includesys/ipc.h#includesys/sem.hintsemctl(intsem_id,intsem_num,intcommand,…);intsemget(key_tkey,intnum_sems,intsem_flags);intsemop(intsem_id,structsembuf*sem_ops,size_tnum_sem_ops);信号量处理函数
以下几个函数用于处理信号量操作#includesys/types.h#includesys/ipc.h#includesys/sem.hintsemctl(intsem_id,intsem_num,intcommand,…);intsemget(key_tkey,intnum_sems,intsem_flags);intsemop(intsem_id,structsembuf*sem_ops,size_tnum_sem_ops);信号量处理函数这些函数可以用来处理一组信号量,但是大多数情况下,一个信号量就够用了。
0101semget函数该函数的作用是创建一个新信号量,或取得一个已有信号量。key:整数值。不相关的进程可以通过它来访问同一个信号量。程序对信号量的访问都是间接的,它先提供一个键,再由系统生成一个信号量标识符,其他函数都通过semget函数返回信号量标识符。intsemget(key_tkey,intnum_sems,intsem_flags);
0101semget函数(续)该函数的作用是创建一个新信号量,或取得一个已有信号量。num_sems:整数值。需要的信号量数目,一般总是1.sem_flags:一组标志,代表该信号量的权限。IPC_CREAT表示创建一个新的信号量(即使对应键已经创建了信号量,也不会错误),可以和权限位按位或。intsemget(key_tkey,intnum_sems,intsem_flags);
intsemop(intsem_id,structsem_buf*sem_ops,size_tnum_sem_ops);0102semop函数该函数的作用是改变信号量的值sem_id:由semget返回的信号量标识符。sem_ops:指向一个结构数组的指针,该结构描述了信号量操作情况num_sem_ops:上述结构数组中元素的个数。structsembuf{ shortsem_num; //信号量编号,如果不使用一组信号量,则取 值一般为0 shortsem_op; //一次操作中希望改变的值,可以为-1,即P 操作,也可以为1,即V操作 shortsem_flg; //通常设为SEM_UNDO,指示操作系统将跟 踪当 前进程对这个信号量的修改情况,如果 这个进程没有释放信号量即终止,那么操作 系统将自动释放该进程持有的信号量。}
0103semctl函数该函数允许直接控制信号该函数允许直接控制信号量信息。sem_id:信号量标识符sem_num:信号量编号,如果只有一个信号量,取值为0.command:SETVAL:信号量初始化为val值(下页)。IPC_RMID:删除不再使用的信号量。intsemctl(intsem_id,intsem_num,intcommand,…);
0103semctl函数该函数允许直接控制信号该函数允许直接控制信号量信息。如果存在第四个参数,将会是一个unionsemun结构。这个需要程序员自己定义。unionsemun{ int
文档评论(0)