信号量的原理是一种数据操作锁的概念,它本身不具备数据交换的功能,而是通过控制其他的通信资源(如文件和外围设备等)来实现进程间通信。
当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值,以判断相应的资源是否可用。当信号量的值大于0时,表明有资源可以请求。当信号量的值等于0时,说明现在无可用资源,所以进程会进入睡眠状态,直至有可用资源为止。
当进程不再使用一个信号量控制的共享资源时,此信号量的值增1。对信号量的值进行增减操作均为原子操作,这是由于信号量的主要作用是维护资源的互斥或多进程的同步访问。而在信号量的创建以及初始化时,不能保证操作均为原子。
同其他的IPC对象一样,内核对每一个信号量集都会设置一个shmid_ds结构,同时用一个无名结构来标识一个信号量。简要定义如下。
1.信号量的创建
同共享内存一样,系统中同样需要为信号量集定制一系列专有的操作函数。系统命令ipcs可查看当前的系统IPC的状态,在命令后使用-s参数。使用函数semget()可以创建或者获得一个信号量集ID。该函数的原型如下。
该函数用来取得参数key所关联的信号标识码,每一个IPC对象与一个key相对应。如果参数key为IPC_PRIVATE,则会建立新的信号队列。如果key不为IPC_PRIVATE,也不是已经建立的信号队列IPCkey,系统就会视参数flag是否有IPC_CREAT位来决定IPCkey为参数key的信号队列。参数nsems是一个大于等于0的值,用于指明该信号量集中的可用资源数(在创建一个信号量时)。当打开一个已存在的信号量集时,该参数值为0。若函数执行成功,则返回信号量集的标识符(一个大于等于0的整数);若函数执行失败,则返回-1。
函数semop()用以操作一个信号量集。该函数的原型如下。
(www.xing528.com)
sem_op的值是一个整数。sem_op的取值及操作见表9-7。
表9-7 sem_op的取值及操作
2.信号量集的操作
信号量有自己的专属操作函数semctl()。该函数的原型如下。
其中,参数semid是要处理的信号队列识别码,参数semnum指定semid的信号集中的某一个信号灯,其类似于在信号量集资源数组中的下标,用来对指定资源进行操作。参数cmd定义了函数所要进行的操作。cmd参数的取值及操作见表9-8。
表9-8 cmd参数的取值及操作
若函数成功,则返回值大于等于0(当semctl的操作为GET操作时,返回相应的值,其余情况返回0);若函数失败,则返回-1,并设置错误变量errno。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。