首页 理论教育 信号量的作用、操作和函数-嵌入式Linux编程

信号量的作用、操作和函数-嵌入式Linux编程

时间:2023-10-31 理论教育 版权反馈
【摘要】:当信号量的值大于0时,表明有资源可以请求。对信号量的值进行增减操作均为原子操作,这是由于信号量的主要作用是维护资源的互斥或多进程的同步访问。当打开一个已存在的信号量集时,该参数值为0。函数semop()用以操作一个信号量集。表9-7 sem_op的取值及操作2.信号量集的操作信号量有自己的专属操作函数semctl()。

信号量的作用、操作和函数-嵌入式Linux编程

信号量的原理是一种数据操作锁的概念,它本身不具备数据交换的功能,而是通过控制其他的通信资源(如文件和外围设备等)来实现进程间通信。

当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值,以判断相应的资源是否可用。当信号量的值大于0时,表明有资源可以请求。当信号量的值等于0时,说明现在无可用资源,所以进程会进入睡眠状态,直至有可用资源为止。

当进程不再使用一个信号量控制的共享资源时,此信号量的值增1。对信号量的值进行增减操作均为原子操作,这是由于信号量的主要作用是维护资源的互斥或多进程的同步访问。而在信号量的创建以及初始化时,不能保证操作均为原子。

同其他的IPC对象一样,内核对每一个信号量集都会设置一个shmid_ds结构,同时用一个无名结构来标识一个信号量。简要定义如下。

978-7-111-33316-6-Chapter09-72.jpg

978-7-111-33316-6-Chapter09-73.jpg

1.信号量的创建

同共享内存一样,系统中同样需要为信号量集定制一系列专有的操作函数。系统命令ipcs可查看当前的系统IPC的状态,在命令后使用-s参数。使用函数semget()可以创建或者获得一个信号量集ID。该函数的原型如下。

978-7-111-33316-6-Chapter09-74.jpg

该函数用来取得参数key所关联的信号标识码,每一个IPC对象与一个key相对应。如果参数key为IPC_PRIVATE,则会建立新的信号队列。如果key不为IPC_PRIVATE,也不是已经建立的信号队列IPCkey,系统就会视参数flag是否有IPC_CREAT位来决定IPCkey为参数key的信号队列。参数nsems是一个大于等于0的值,用于指明该信号量集中的可用资源数(在创建一个信号量时)。当打开一个已存在的信号量集时,该参数值为0。若函数执行成功,则返回信号量集的标识符(一个大于等于0的整数);若函数执行失败,则返回-1。

函数semop()用以操作一个信号量集。该函数的原型如下。

978-7-111-33316-6-Chapter09-75.jpg(www.xing528.com)

sem_op的值是一个整数。sem_op的取值及操作见表9-7。

表9-7 sem_op的取值及操作

978-7-111-33316-6-Chapter09-76.jpg

2.信号量集的操作

信号量有自己的专属操作函数semctl()。该函数的原型如下。

978-7-111-33316-6-Chapter09-77.jpg

其中,参数semid是要处理的信号队列识别码,参数semnum指定semid的信号集中的某一个信号灯,其类似于在信号量集资源数组中的下标,用来对指定资源进行操作。参数cmd定义了函数所要进行的操作。cmd参数的取值及操作见表9-8。

表9-8 cmd参数的取值及操作

978-7-111-33316-6-Chapter09-78.jpg

若函数成功,则返回值大于等于0(当semctl的操作为GET操作时,返回相应的值,其余情况返回0);若函数失败,则返回-1,并设置错误变量errno。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈