linux中信号量,记住四个结构(struct semid_ds,信号量的无名结构,struct sembuf,union semun)和三个函数(semget,semctl,semop)
四个结构分别是:1.信号量集合结构 struct semid_ds{
struct ipc_perm sem_perm; /*关于权限的*/
unsignec short sem_nsems;/*关于信号量集合中信号量数目的*/
time_t sem_otime;/*上一次进程semop的时间*/
time_t sem_ctime;/*上一次修改的时间*/
....
};
2.单个信号量的结构,他是一个无名结构如下
struct {
unsigned short semval;/*信号量的值*/
pid_t sempid;/*上一次对该信号量进行操作的进程*/
unsigned short semncnt;/*因为申请资源数大于信号量现有资源数的而挂起的进程的数量*/
unsinged short semzcnt;/*某些进程根据操作,要求是信号量为0其才返回,那么semzcnt就是因信号量的当前值不为0而挂起的进程数
....
}
3.对信号量进程操作的设定的数据结构
struct sebuf{
unsigned short sem_num;/*对哪个信号量进行操作*/
short sem_op;/*进行什么操作,是进程申请资源还是释放资源or等于0返回*/
short sem_flg;/*操作的一些设定,是否等待,是否undo*/
};
4.对信号量进行控制的第四个参数
union semun {
int val; / *在semctl函数中如果cmd为SETVAL 则设定值就为val*/
struct semid_ds *buf;/*对信号量的数据结构进行读取和设定时用到此变量*/
struct short *array;/*在semctl函数中如果cmd为SETALL 或GETALL,则将设定或得到的值放在此数组中*/
};
三个函数分别是:1.int semget(key_t key,int nsems,int flag) /*创建一个信号量集合,这个信号量集合中信号量的数目为nsems,对该信号量集合的用户权限是flag*/
2.int semctl(int semid,int semnum,int cmd,.../*union semun arg*/)/*对一个已存在的信号量集合semid中的某一信号semnum,进行cmd的操作*/
3.int semop(int semid,struct sembuf array[],size_t nops);/*对信号量集合semid中的nops个信号量进行操作,这些操作主要就是进程的资源申请等*/
注意:semctl 与semop之间的区别,前者是对数据结构进行一些操作,而后者则是进程和信号量之间的关系的操作。
参考资料 《unix 环境高级编程》 第二版