曲径通幽论坛

标题: semop | 信号量操作 [打印本页]

作者: beyes    时间: 2009-9-4 14:55
标题: semop | 信号量操作
信号量的值与相应资源的使用情况有关,但它的值大于 0 时,表示当前可用资源的数量,当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变。

在  Linux 下,PV 操作通过调用函数 semop() 实现,该函数定义在头文件 sys/sem.h 中,其原型为:
#include <sys/types.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 指出将要进行操作的信号个数。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2