进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。
二值信号灯:信号灯的值只能取0或1,类似于互斥锁。 但两者有不同:
信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;
互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
计数信号灯:信号灯的值可以取任意非负值。
下面是信号量的相关函数
semget
函数作用:创建信号量
函数原型:int semget(key_t key,int nsems,int semflg)
函数参数:nsems:信号量数目,通常取一个
semflg:与open权限一样
返回值:成功则返回信号量标识符;出错-1
semctl
函数作用:信号量的控制,初始化,删除等
函数原型:int semctl(int semid,int semnum,int cmd,union arg)
函数参数:semnum1,通常为0,第一个信号量
cmd:IPC_STAT
IPC_SETVAL:设置arg中的val值
IPC_GETVAL:获取信号量的值
IPC_RMID:删除信号量
返回值:cmd不同,返回值不同。IPC_GETCAL返回信号量的值,其余的成功返回0,出错-1
semop
函数作用:执行PV操作
函数原型:int semop(int semid,struct sembuf *sops,size_t nsops)
函数参数:struct sembuf *sops:
sem_op = -1,P操作
sem_op = 1,V操作
nsops = 1
返回值:信号量标识符,出错-1