System V 信号量使用相关函数
System V 信号量
在提到Posix 信号量时,指的是二值信号量或计数信号量,而System V信号量指的是入了计数信号量集
二值信号量:其值为0或1,类似于互斥锁,资源被锁住时为0,资源可用为1
计数信号量:其值在0和某个限制值之间的信号量,信号量的值就是可用资源数
计数信号量集:一个或多个信号量构成一个集合,集合中每个元素都是计数信号量(每个集合的信号量数存在一个限制)
semid_ds结构:
内核为每个信号量集维护的信息结构
#include <sys/sem.h> struct semid_ds{
struct ipc_perm sem_perm; // 当前信号量的访问权限
struct sem *sem_base; // 内核用于维护某个给定信号量的一组值的内部数据结构
ushort sem_nsems; // 集合中信号量的数目
time_t sem_otime; // 最近一次执行semop()的时间
time_t sem_ctime; // 集合创建时间或最近一次IPC_SET的时间
}; struct sem{
ushort_t semval; // 信号量实际值
short sempid; // 对信号量值执行最后一次操作的进程的进程ID
ushort_t semncnt; // 等待信号量值增长的进程数
ushort_t semzcnt; // 等待信号量值变为0的进程数
};
semget()函数:
#include <sys/sem.h> // 创建一个信号量集或访问一个已存在的信号量集
// 成功返回非负信号量标识符,出错返回-1
int semget(key_t key, int nsems, int oflag);
// key: IPC 键
// nsems:指定集合中信号量数
// oflag:SEM_R(读)和SEM_A(改)的组合,还可以按位与IPC_CREAT或IPC_CREAT|IPC_EXCL
semop()函数:
#include <sys/sem.h> // 对信号量集中一个或多个信号量进行操作
// 成功返回0,出错返回-1
int semop(int semid, struct sembuf *opsptr, size_t nops);
// semid:由semget()函数返回的信号量标识符
// nops: 指出opsptr指向的结构数组的元素数量
// opsptr:指向一个如下的数组 struct sembuf{
short sem_num; // 信号量集中信号量的索引值:0, 1, ... , nsems-1(sem_base[sem_num], 指定对某个特定信号量进行操作)
short sem_op; // 指定对特定信号量的操作
short sem_flg; // 操作标志,0, IPC_NOWAIT、SEM_UNDO
};
// sembuf结构内元素的排列顺序并不保证如上述那样,只保证该结构中有上述三个元素
// sembuf结构不能静态初始化(struct sembuf value = {0, 0, 0} // Error)
// sembuf结构需要运行时初始化(struct sembuf value; value.sem_num = 0; ...) // sem_op:每个特定的操作有sem_op确定,它可以是负数、0、正数
// sem_op为正数时,其值加到semval(信号量当前值)上,对应于释放信号量控制的资源
// 如果指定了SEM_UNDO标志,就从相应信号量的semadj(所指定信号量针对调用进程的调整值)减去sem_op
// sem_op为0,调用者等待semval变为0,如果semval已经为0,则立即返回
// sem_op为负数,调用者希望等待semval变为大于或等于sem_op的绝对值,这对应于分配资源
semctl()函数:
#include <sys/sem.h> // 对一个信号量执行各种控制操作
// 成功返回非负值,出错返回-1
int semctl(int semid, int semnum, int cmd, ... /* union semun arg */);
// semid: 标识其操作待控制的信号量集
// semnum: 标识信号量集内的某个成员(sem_base[sem_num]) // cmd:可选值如下(除非另外说明,操作成功函数返回值为0,出错为-1)
// GETVAL:将semval的当前值作为函数返回值返回
// SETVAL:将semval设为arg.val(若操作成功,那么相应信号量的semadj被设为0)
// GETPID:将sempid的当前值作为函数返回值返回
// GETNCNT:将semncnt(等待semval变为大于其当前值的线程数)的当前值作为函数返回值返回
// GETZCNT:将semzcnt(等待semval变为0的线程数)的当前值作为函数返回值返回
// GETALL:返回指定信号量集内每个成员的semval值(这些值通过arg.array指针返回)
// SETALL:设置指定信号量集内每个成员的semval值(这些值通过arg.array指针传递)
// IPC_RMID:将由semid指定的信号量集从系统删除
// IPC_SET:设置指定信号量集的semid_ds结构中的sem_perm.uid、sem_perm.gid、sem_perm.mode,这些值由arg.buf参数指向的结构中的相应成员指定
// IPC_STAT:返回指定信号量集当前的semid_ds结构(通过arg.buf) // arg: 可选参数,根据 cmd 参数而定
union semun{
int val;
struct semid_ds *buf;
ushort *array;
};
System V 信号量使用相关函数的更多相关文章
- 第11章 System V 信号量
11.1 概述 信号量按功能分:二值信号量.计数信号量.信号量集:其中二值信号量和计数信号量指的是Posix信号量,信号量集指的是System V信号量.
- System V信号量
信号量对比 二值信号量:其值要么0要么1,比如互斥锁就是这种类型 计数信号量:其值为0或某个正整数,比如POSIX 信号量 计数信号量:一个或多个信号量构成一个集合,每个都是计数信号量,比如Syste ...
- UNIX环境高级编程——system V信号量
1. 信号量(semaphore)主要用于保护临界资源.进程可以根据它判断是否能访问某些共享资源.信号量除了用于访问控制外,还可用于进程同步,也就是进程间通信.2. 信号量分类:a. 二值信号量: 信 ...
- Linux IPC实践(11) --System V信号量(1)
信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...
- linux网络编程之system v信号量(二)
今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...
- linux网络编程之system v信号量(一)
今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...
- Linux中的System V信号量
在进程同步,并发运行时,保证按序地访问共享资源是十分重要的.因此引入了临界区的概念,一次只能有一个线程进入临界区完成他的指令.而信号量(semaphore)的作用,类似于一个交通信号灯,它负责进程协作 ...
- system V信号量和Posix信号量
一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...
- Linux IPC System V 信号量
模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> ftok() //获取key ...
随机推荐
- Java单例模式简单实现
代码 public class Singleton { private static Singleton singleton;//创建一个单例对象 public static Singleton ge ...
- 数据库质疑或只有MDF文件资料
--允许进行系统表的操作 use master declare @databasename varchar(255) set @databasename='Blwy BarCode' --1.如果用户 ...
- DDoS 攻击与防御:从原理到实践(上)
欢迎访问网易云社区,了解更多网易技术产品运营经验. 可怕的 DDoS 出于打击报复.敲诈勒索.政治需要等各种原因,加上攻击成本越来越低.效果特别明显等趋势,DDoS 攻击已经演变成全球性的网络安全威胁 ...
- log4j动态日志级别调整
1. 针对root logger的设置 log4j.rootLogger=INFO, CONSOLELogger.getRootLogger().setLevel(org.apache.log4j.L ...
- NYOJ 232 How to eat more Banana
How to eat more Banana 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 A group of researchers are designing ...
- 快速排序php
<?php /** * Created by PhpStorm. * User: brady.wang * Date: 2017/11/10 * Time: 9:45 */ $arr=array ...
- 【bzoj4237】稻草人 分治+单调栈+二分
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- 【bzoj4826】[Hnoi2017]影魔 单调栈+可持久化线段树
题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
- Spring Cloud 从入门到精通
Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. 本 ...
- 转载:LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
原文地址:http://yacare.iteye.com/blog/2010049 很多伙伴在更新VS2010,或者卸载VS2012安装2010后,建立Win32 Console Project/MF ...