一. 相关概念
1.对信号量的基本定义
信号量本质上是一个计数器,里面的数字大小来记录临界资源的数目,其中有多少资源,信号量的大小就是多少,当信号量的值为1的时候,此时的信号量就叫做二元信号量,又称为互斥锁。同时需要注意的是信号量也属于临界资源,它的存在是为了保护临界资源,解决数据不一致的现象。
因此为了保证信号量的临界访问,于是就约定对信号量的操作必须满足原子操作。
2.进程互斥
由于进程需要互相某些资源,因此各进程之间需要互斥访问某些资源,进程的这种关系叫做进程之间的互斥(在如何时间点,对临界区的访问只允许一个进程对其访问).
系统中某些资源一次只允许一个进程对其操作,我们称这种资源叫做临界资源.而在进程中访问临界资源的那段代码就叫做临界区.
3.信号量的 P V 操作
当P V操作在一个进程中执行的时候,就必须满足互斥原理,当 P V 不在同一个进程中的之后,此时必须满足同步性(以相对较安全的顺序访问资源,防止进程饥饿现象)
(1)对临界资源进行 P 操作时, 对应的信号量的只需要减1
(2) 对临界资源进行 V 操作时, 对应的信号量的值就需要 加 1.
二. 信号量的相关函数以及信号量数据结构
1.信号量数据结构
2.创建信号量集的函数
(1) key 是信号量集的名字
(2) nesms 是表示信号量集中的信号量的个数
(3) semflg 的设置系统中规定为 IPC_CREAT, IPC_EXCL, 用户可以根据自己的需求对其设置, 当设置了IPC_CREAT 和 IPC_EXCL 时, 即就是当系统中没有信号量集的时候系统创建一个新的信号量集, 当系统中已经有信号量集的时候就会报错,而当只单独设置了 IPC_CREAT 的时候,当系统中没有信号量集合的时候就创建一个新的信号量集, 当系统中已经有信号量集的时候, 系统将返回系统中已有的信号量集的id
(4) 函数执行成功时返回信号量集的标识 id,失败时返回 -1
3.信号量集的控制函数
(1) semid 是有shmget 返回的信号量集标识符
(2) semum 是表示信号量集中信号量的数目
(3) cmd 表示要对信号量采取的相应动作, 包括一下几个取值
函数成功调用时返回 0, 函数调用失败时返回 -1