Linux的信号量机制
#include<sys/sem.h>
int semctl(int sem_id , int sem_num , int command , ...);
int semget(key_t key , int num_set , int sem_flags);
int semop(int sem_id struct sembuf *sem_ops , size_t num_sem_ops);
头文件sys/sem.h通常依赖于另外两个有文件sys/types.h和sys/ipc.h。一般情况下,他们会被sys/sem.h自动包含,因此不需要为它们明确添加相应的#include语句。
参数key的作用很像一个文件名,它代表程序可能要使用的某个资源,如果多个程序使用相同的key值,它将负责协调工作。
1.semget函数
semget函数的作用是创建一个新信号量或取得一个已有信号量的键:
int semget(key_t key , int num_set , int sem_flags);
第一个参数是整数值,不相关的进程可以通过它访问同一个信号量。只有semget函数才直接使用信号量键,所有其他的信号量函数都是使用有semget函数返回的信号量标识符。
num_sems指定需要的信号量的数目,它几乎总是取值为1。
sem_flags参数是一组标志,它与open函数的标志非常相识。
2.semop函数
semop函数用于改变信号量的值,它的定义如下所示:
int semop(int sem_id , struct sembuf *sem_ops , size_t num_sem_ops);
第一个参数sem_id是由semget返回的信号量标识符。第二个参数sem_ops是指向一个结构数组的指针,