Linux停多任务间通信和同步-System V信号量
Linux下多任务间通信和同步-System V信号量Linux下多任务间通信和同步-System V信号量嵌入式开发交流群280
Linux下多任务间通信和同步-System V信号量
Linux下多任务间通信和同步-System V信号量
嵌入式开发交流群280352802,欢迎加入!
一.简介
信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制.相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志.出了用于访问控制外,还可用于进程同步.信号量有以下两种类型:
二值信号量:最简单的信号量形式,信号量的值只能取0或1;计算信号量:信号量的值可以取任意非负值(当然受内核本身的约束).
操作信号量的方法与消息队列类似,主要包括三种类型:
打开或创建信号量;增加或减少信号量的值;获得或设置信号量属性.信号量同步的原理实际上就是操作系统中所用到的PV原语.一次P操作使信号量sem减1,而一次V操作使信号量sem加1.进程(或线程)根据信号量的值来判断是否对共享资源具有访问权限.当sem的值大于等于0时,该进程(或线程)具有公共资源的访问权限;相反,当sem的值小于0时,该进程(或线程)将阻塞直到sem的值大于等于0为止.
信号量有两组系统调用函数.一种叫做System V信号量常用于进程的同步;另一种来源于POSIX,常用于线程同步.两者非常相似,但它们使用的函数调用却各不相同.本文介绍System V信号量的系统调用,后续的博文中介绍POOIX信号量.这组信号量系统调用的名字都以"sem"开头,基本的系统调用有三个:semget,semopt和semctl.
二.semget系统调用
该函数调用返回与键值key相对应的信号量描述子。其原型如下: