前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNPv2第十一章:System V信号灯

UNPv2第十一章:System V信号灯

作者头像
提莫队长
发布2019-03-01 09:39:17
4650
发布2019-03-01 09:39:17
举报
文章被收录于专栏:刘晓杰刘晓杰

二值信号灯:值为0或1的信号灯。资源如果被锁住就是0,如果可用为1 计数信号灯:值在0到某个限制值之间的信号灯。信号灯的值就是可用资源数

1 semget函数

创建一个信号灯集或访问一个已存在的信号灯集

#include<sys/sem.h>
Int segget(key_t key, int nsems, int oflag);
    //返回:成功时为非负标识符,出错时为-1

返回值是一个信号灯标识符,semop和semctl函数将使用它 Nsems参数指定集合中的信号灯数。如果只是访问一个信号灯集,可以置为0.一旦创建完毕一个信号灯集,我们就无法改变信号灯数 Oflag值是SEM_R和SEM_A常值的组合。(R代表read,A代表alter)。它还可以与IPC_CREAT或IPC_CREAT|IPC_EXCL按位或。

2 semop函数

#include<sys/sem.h>
int semop(int semid, struct sembuf *opsptr, size_t nops);
    //调用成功返回 0,失败返回 -1。

函数的参数 semid 为信号量集的标识符; 参数 nops 指出将要进行操作的信号的个数; semop 的第二个参数 sops 指向的结构体数组中,每个 sembuf 结构体对应一个特定信号的操作。因此对信号量进行操作必须熟悉该数据结构,该结构定义在 linux/sem.h,如下所示:

struct  sembuf{
    short   sem_num; //信号在信号集中的索引,0代表第一个信号,//1代表第二个信号  
    short   sem_op; //操作类型
    short   sem_flg;    //操作标志
};

3 semctl函数

semctl函数对一个信号量执行各种控制操作。

#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ... );

 参数semid标识待控制其操作的信号灯集  参数semnum标识该信号灯集中的某个成员(0,1到nsems-1)。semnum值仅仅用于GETVAL、SETVAL、GETNCNT、GETZCNT和GETPID命令  第四个参数是可选的,取决于第三个参数cmd

union semun { 
         int val;               // SETVAL使用的值   
         struct semid_ds *buf;  // IPC_STAT、IPC_SET 使用缓存区
         unsigned short *array; // GETALL,、SETALL 使用的数组 
};

从Posix信号灯到System V信号灯发生了如下变动:  System V信号灯由一组值构成。当指定应用到某个信号灯集的一组信号灯操作时,要么所有操作都执行,要么一个操作都不执行  可应用到一个信号灯集的每个成员的操作有三种:测试其值是否为0、往其值加一个整数以及从值中减掉一个整数(假设结果值仍然非负)  创建一个System V信号灯集需要技巧,因为创建该集合并随后初始化各个值需要两个操作,从而可能导致竞争状态  System V信号灯提供“复旧”特性,该特性保证在进程终止时反转某个信号灯操作

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 semget函数
  • 2 semop函数
  • 3 semctl函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档