|
信号量的值与相应资源的使用情况有关,但它的值大于 0 时,表示当前可用资源的数量,当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变。
在 Linux 下,PV 操作通过调用函数 semop() 实现,该函数定义在头文件 sys/sem.h 中,其原型为:
| #include <sys/ipc.h> | #include <sys/sem.h> | | int semop(int semid, struct sembuf *sops, unsigned nsops); |
参数 semid 为信号集的标识符;
参数 sops 是 struct sembuf 结构的指针,sembuf 结构为:/* semop system calls takes an array of these. */
struct sembuf {
unsigned short sem_num; /* semaphore index in array */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
}; sembuf 结构中,
sem_num 信号量集(信号量数组)的索引值,表示将要在信号量中的哪个信号量上执行操作。
sem_op 指定将要执行的操作。
sem_op 的值的含义:
sem_op < 0 对应于资源的分配;信号加上 sem_op 的值,若没有设置 IPC_NOWAIT ,则调用进程阻塞,直到资源可用;否则进层直接返回 EAGAIN 。
sem_op =0 如果没有设置 IPC_NOWAIT ,则调用进程进入睡眠状态,直到信号值为 0 ;否则进程不会睡眠,直接返回 EAGAIN 。
sem_op > 0 表示进程释放控制的资源。 |
sem_flg 指定与将要执行的操作关联的所有标志。一般的,这个标志值设置为 SEM_UNDO 。这样就会让操作系统跟踪当前进程在信号量上所做的变化,如果进程没有释放信号量而终止,那么系统会自动的释放掉信号量!
参数 nsops 指出将要进行操作的信号个数。 |
|