信号量

来源:互联网 发布:用跳蛋是什么体验知乎 编辑:程序博客网 时间:2024/05/23 12:34
信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源。

进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。

二值信号灯:信号灯的值只能取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


0 0