Chinaunix首页 | 论坛 | 博客
  • 博客访问: 819164
  • 博文数量: 125
  • 博客积分: 4066
  • 博客等级: 上校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 18:58
文章分类

全部博文(125)

文章存档

2014年(1)

2013年(1)

2012年(2)

2011年(29)

2010年(92)

我的朋友

分类: LINUX

2010-12-13 15:41:41

1. 概念
信号量:代表资源数;
    >0 代表可供并发进程使用的资源实体数;
    =0 代表暂时无可用资源
    <0 代表等待使用资源的进程数;
    初始设置资源数=1,用于互斥的信号量;
    可以通过P、V语操作而改变;

2. 创建信号量
       # include
       # include
       # include
       int semget ( key_t key, int nsems, int semflg )

  成功返回信号ID标识,否则失败返回-1.
参数
说明
key       创建/打开信号量标识key值,由ftok产生,可以直接给常量
nsems     信号ID标识的一组大小。即设置几个信号量。通常为1个
semflg    创建/打开方式IPC_CREAT、IPC_EXCL

3  信号量控制
       #include
       #include
       #include
       int semctl (int semid, int semnum, int cmd, union semun arg)
参数   
说明
semid     已创建的信号ID
semnum    需要控制的信号组某个信号值的下标
cmd
    
具体控制操作:
IPC_RMID 删除信号量ID信息
IPC_EXCL 只有在信号量集不存在时创建
IPC_SET  设置信号量的许可权
SETVAL   设置指定信号量的元素的值为 agc.val
GETVAL   获得一个指定信号量的值
GETPID   获得最后操纵此元素的最后进程ID
GETNCNT  获得等待元素变为1的进程数
GETZCNT  获得等待元素变为0的进程数
arg
操作值的union结构
      union semun {
               int              val;    /* 信号量值 */
               struct semid_ds *buf;    /* 信号状态结构*/
               unsigned short  *array;  /*同组中信号量值 */
       };

4. 信号量操作

       # include
       # include
       # include
       int semop ( int semid, struct sembuf *sops, unsigned nsops )
    成功返回0,否则失败返回-1.
参数
说明
semid      已创建的信号ID
sops       具体的操作结构
nsops      信号组大小
    struct sembuf
    {
            short sem_num; /* 针对信号ID标志组中的下标的信号操作:
                                  =0 第一个信号量 */
            short sem_op; /* 对资源的使用或释放 */
            short sem_flg; /* 操作标志:
                       IPC_NOWAIT:无资源时不等待返回,错误码为:EAGAIN
                       SEM_UNDO:若进程异常退出则由内核代为处理释放*/
    }



 
阅读(1322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~