曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6832|回复: 0
打印 上一主题 下一主题

[进程] semop | 信号量操作

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-9-4 14:55:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
信号量的值与相应资源的使用情况有关,但它的值大于 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 指出将要进行操作的信号个数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 01:20 , Processed in 0.062957 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表