System V信号量
信号量对比
二值信号量:其值要么0要么1,比如互斥锁就是这种类型
计数信号量:其值为0或某个正整数,比如POSIX 信号量
计数信号量:一个或多个信号量构成一个集合,每个都是计数信号量,比如System V信号量
shell查看命令:ipcs -s
基本函数
#include <sys/ipc.h>
key_t ftok(char *fname,int id);
#include <sys/sem.h>
int semget(key_t key,int nsems,int oflag);
int semop(int semid,struct sembuf opsptr[],size_t nops);
int semctl(int semid,int semnum,int cmd,... /* union semun arg */);
//system V信号量结构
struct sem{
ushort semval; //信号量的当前值
short sempid; //最后一次修改进程的PID
ushort_t semncnt;
ushort_t semzcnt;
}
struct sembuf{
short sem_num; //单个信号量的下标,取值范围[0,nsems-1]
short sem_op; //操作值,如负数,0,正数
short sem_flg; //具体的操作,如加或减,可选项有:0,IPC_NOWAIT,SEM_UNDO
};
//senum结构和System V消息队列中的消息结构类似
//只是一个建议结构,在使用时需要在代码中自已定义
union semun{
int val; //SETVAL
struct semid_ds *buf; //IPC_SET, IPC_STAT
ushort; //GETALL, SETALL
};
ftok函数:用于生成一个唯一的key_t, fname为一个已存在的文件名, id取0-255之间的正整数, 两者组合形成一个key
semget函数:用于创建或打开System V信号量,nsems表示信号量集合中信号量的个数,oflag为IPC_CREAT|IPC_EXCL|0644类似的组合
semctl函数:cmd如下
IPC_STAT, 返回指定信号量集当前的semid_ds结构
IPC_RMID, 删除指定的信号量集
SETALL, 设置信号量集中每个成员的semval值
GETALL, 返回信号量集中每个成员的semval值
IPC_SET, 设置指定信号量集的semid_ds结构中三个成员,sem_perm.uid,sem_perm.gid,sem_perm.mode
semop函数:nops指定前面的opsptr数组的数量, semop分两种操作,一种是等待,一种是增减
等待,当sem_op为0时等待信号量的值为0时返回
加减,当sem_op为负数时,等待信号量的值为大于或等于该负数的绝对值时返回,同时会将信号量的值减去该负数的绝对值
例子
通过信号量来同步父子进程的输出
#include "unpipc.h"
#include <sys/sem.h>
int main(int argc, char *argv[]){
int c,i,semid,nops;
struct sembuf *ptr;
semid=semget(ftok(argv[1],0),1,0644|IPC_CREAT|IPC_EXCL);
semctl(semid,0,SETVAL,mun.val);
ptr=calloc(3,sizeof(struct sembuf));
//ptr[0]加2,ptr[1]等待为0,ptr[2]减1
for(i=0;i<3;i++){
ptr[i].sem_num=0;
ptr[i].sem_op=1-i;
ptr[i].sem_flg=0;
}
ptr[0].sem_op=2;
if(Fork() == 0){
puts("left hand");
semop(semid,&ptr[2],1);
semop(semid,&ptr[2],1);
puts("left foot");
semop(semid,&ptr[2],1);
}else{
semop(semid,&ptr[1],1);
puts("right hand");
semop(semid,&ptr[0],1);
semop(semid,&ptr[1],1);
puts("right foot");
sleep(1);
semctl(semid,0,IPC_RMID);
}
exit(0);
}
System V信号量的更多相关文章
- 第11章 System V 信号量
11.1 概述 信号量按功能分:二值信号量.计数信号量.信号量集:其中二值信号量和计数信号量指的是Posix信号量,信号量集指的是System V信号量.
- 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 ...
随机推荐
- iOS 画图讲解2
1.图片水印 //layer上下文只能显示在drawRect里 //当开启上下文时,绘制图形即可在viewDidLoad中实现 //位图的上下文 //UIGraphicsBeginImageConte ...
- 跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
采用JavaScript来控制iframe元素的高度是iframe高度自适应的关键,同时由于JavaScript对不同域名下权限的控制,引发出同域.跨域两种情况. 由于客户端js使用浏览器的同源安全策 ...
- Ubuntu(16.04) 下如何修改(安装)arm-linux-gcc编译器
ubuntu下如何修改(安装)arm-linux-gcc编译器 将gcc解压到根目录 sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C / 查看原来的环境变量 e ...
- 浅析console和浏览器命令行API
一.console对象: F12或者Control+Shift+i(Win)/ Alt+Command+i(Mac)打开浏览器自带的开发工具,选择顶部tab中的最后一项console,这样你就可以尽情 ...
- MySQL 中随机抽样:order by rand limit 的替代方案
最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RA ...
- hdu 3308 LCIS 线段树
昨天热身赛的简单版:LCIS.昨天那题用树链剖分,不知道哪里写错了,所以水了水这题看看合并.更新方式是否正确,发现没错啊.看来应该是在树链剖分求lca时写错了... 题目:给出n个数,有两种操作: 1 ...
- Python15-day1课后作业
功能:编写一个用户登录接口 要求:1)根据提示输入用户名.密码信息 2)输入的用户.密码正确则显示欢迎信息 3)连续三次输入错误则锁定账号 #coding=utf-8import sys,os,get ...
- HTML常见标签
标题:h1.h2.h3.h4.h5.... 段落:p 换行:br 容器:div.span(用来容纳其他标签) 表格:table.tr.td 列表:ul.ol.li 图片:img 表单:input 链接 ...
- Table of Contents - Spring
The IoC container Spring 容器 属性注入 & 构造注入 Bean 实例的创建方式 p-namespace & c-namespace 集合属性的注入 作用域 延 ...
- springmvc的一个小例子学习(一)
个人觉得,学框架最好的 方法无外乎两个:一个是实践这个框架,真实的去用它,比如spring框架,先搭一个简单的spring项目,然后一步一步得去丰富它,从中学到spring框架的精髓和知识:另外一个就 ...