System V 信号量
1 概述
计数信号量集semid_ds:
struct semid_ds
{
struct ipc_perm sem_perm;
struct sem *sem_base; //指向信号量结构数组
unsigned short sem_nsems; //信号量集中信号量数目
time_t sem_otime; //last semop时间
time_t sem_ctime;
};
sem结构是内核用于维护某个给定信号量的内部数据结构:
struct sem
{
unsigned short semval; //信号量值
pid_t sempid;
unsigned short semncnt; //等待信号量值增长到某个值的进程数
unsigned short semzcnt; //等待信号量值为0的进程数
};
2 semget函数
#include <sys/sem.h>
int semget(key_t key,int nsems,int oflag)
key为IPC_PRIVATE或未与某个IPC对象相关联其oflag中指定IPC_CREAT,则创建信号量集
信号量集中信号量值并不进行初始化,需要通过SETVAL或SETALL命令调用semctl函数进行初始化
3 semop函数
semop函数对信号量集进行操作,增加或减小信号量值,对应释放与分配资源
int semop(int semid,struct sembuf *opsptr,size_t nops)
sembuf是针对信号集中的某个信号进行指定操作的结构,semop函数在信号集semid上进行nops个信号操作
struct sembuf
{
short sem_num;
short sem_op;
short sem_flg;
};
sem_num:指定信号集中进行操作的信号
sem_op:大于0:进程释放sem_num信号量关联的资源,释放资源数为sem_op,将sem_op加到信号值中,同时从信号量调整值中减去sem_op
小于0:进程希望获取sem_num信号量关联的资源,占用数为|sem_op|,根据semval的值和sem_flg决定阻塞还是返回
等于0:进程希望等待信号量值变成0
sem_flg:IPC_NOWAIT:非阻塞
IPC_UNDO:是否开启信号量调整(占用资源的进程因临时终止没能调整信号量值的情况是存在的,为了避免,在分配或释放资源时,用信号量调整值记录进程占用的资源)
4 semctl函数
int semctl(int semid,int semnum,int cmd,/* union semun arg */)
semctl函数中cmt命令分为三种:针对信号量集本身,针对某个信号量,针对所有信号量
因此定义共用体semun,针对不同的cmd,对semun有不同的使用:
union semun
{
int val; //SETVAL
struct semid_ds *buf; //IPC_STAT,IPC_SET
unsigned short *array; //SETALL,GETALL
};
针对信号量集:
IPC_STAT:取信号量集信息存于semun.buf中
IPC_SET:根据semun.buf设置信号量集的sem_perm.uid,sem_perm.gid
IPC_RMID:删除信号量集
针对特定信号量semnum:
GETVAL:返回信号量semval
SETVAL:根据semun.val设置信号量值
GETPID:返回信号量的sempid
GETNCNT:返回信号量的semncnt
GETZCNT:返回信号量的semzcnt
针对所有信号量:
GETALL:写所有信号量值到semun.array
SETALL:根据semun.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 ...
- System V 信号量使用相关函数
System V 信号量 在提到Posix 信号量时,指的是二值信号量或计数信号量,而System V信号量指的是入了计数信号量集 二值信号量:其值为0或1,类似于互斥锁,资源被锁住时为0,资源可用为 ...
- 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 ...
随机推荐
- Configuring Active Directory Federation Services 2.0 (配置 adfs 2.0) -摘自网络
Active Directory Federation Services (AD FS) 2.0 makes it possible to deploy a federation server and ...
- hdoj 3549 Flow Problem【网络流最大流入门】
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- IOS网络多线程-GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...
- hdu 3722 Card Game 二分图的最大权匹配
题目可以转化为2个集合,x集合和y集合,其中的元素是1-n个字符串. 首先预处理点与点的边权,然后直接用二分图的最大权匹配模板. #include<stdio.h> #include< ...
- [二]Ajax基本实现
<script text="text/javascript"> function ajax(){ var httpRequest; if(windows.httpReq ...
- 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
1.查看表空间中数据文件存储的路径以及是否可以自动扩展 SELECT TABLESPACE_NAME, BYTES/1024/1024 FILE_SIZE_MB, FILE_NAME FROM DBA ...
- Http协议简单解析及web请求过程
HTTP协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. 基于HTTP协议的客户端/服务器请求响应机制的信息交换过程包含下面几个步骤: 1) ...
- ARR状态监控脚本
##################################################################################### # THIS IS SAMP ...
- MYSQL在线注释文档--- 在gdb中显示源码(gdbtui使用方法)----赖明星的个人博客
http://mingxinglai.com/cn/2013/07/gdbtui/ MySQL源码注释与类图 http://mingxinglai.com/cn/2015/08/mysql-annot ...
- 标准I/O库之二进制I/O
如果进行二进制I/O操作,那么我们更愿意一次读或写整个结构.因此,提供了下列两个函数以执行二进制I/O操作. #include <stdio.h> size_t fread( void * ...