我对信号量的理解

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 环境高级编程》 第二版

你可能感兴趣的:(我对信号量的理解)