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 ...
随机推荐
- C语言内存函数
http://see.xidian.edu.cn/cpp/u/hs3/ 函数 说明 calloc() 分配内存空间 free() 释放内存空间 getpagesize() 取得内存分页大小 mallo ...
- eclipse中tab键设置
1.点击 window->preference-,依次选择 General->Editors->Text Editors,选中右侧的 insert space for tabs;如下 ...
- OkHttpUtil
package jp.co.gunmabank.util import android.os.Handlerimport android.os.Looperimport com.google.gson ...
- 开源中国git关联xcode操作步骤
1.网上代码托管有好多我选了开源中国的git 2.开源中国链接:http://git.oschina.net 3.在git上创建一个新的项目 4.打开终端全局设置名字和邮箱 tanqihongdeiM ...
- jenkins+jacoco+ant+apache集成统计web端功能测试覆盖率
一.覆盖率定义 作为一个测试人员,保证产品的软件质量是其工作首要目标,为了这个目标,测试人员常常会通过很多手段或工具来加以保证,覆盖率就是其中一环比较重要的环节. 我们通常会将测试覆盖率分为两个部分, ...
- 【Luogu】P1122最大子树和(DFS,树上DP)
题目链接 感觉自己DP好烂啊 道道看题解 钦定1为根,DFS搜索子树权值.如果子树权值大于0就将当前节点加上子树权值,反之就把子树扔掉.最后在所有节点的权值中寻找最优解. void dfs(int ...
- BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机
本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...
- OS X 下iso刻录U盘(系统安装启动盘)
1. 查看盘 $diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER : GUID_partition_scheme *320.1 GB disk ...
- Fruit Ninja
Fruit Ninja 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Fruit Ni ...
- T3054 高精度练习-文件操作 codevs
http://codevs.cn/problem/3054/ 题目描述 Description 输入一组数据,将每个数据加1后输出 输入描述 Input Description 输入数据:两行,第 ...