IPC 进程间通信方式——信号量
信号量
- 本质上是共享资源的数目,用来控制对共享资源的访问。
- 用于进程间的互斥和同步
- 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对多对信号量一次性操作。对信号量集中所有的操作可以要求全部成功,也可以部分成功
- 二元信号量(信号灯)值为0和1
- 对信号量做PV操作
信号量集属性
#include<sysm.h>
struct semid_ds
{
struct ipc_perm sem_perm;
unsigned short sem_nseme; //信号灯的数量
time_t sem_otime; //最后一次操作的时间
time_t sem_ctime; //最后一次改变的时间
};
创建信号量集
#include <sysm.h>
int semget(key_t key,int nsems,int flag);
//返回:如果成功,返回信号量集ID,出错返回-1
- 参数
- key:用户指定的信号量集键值
- nsems:信号量集中信号量的个数
- flag:IPC CREAT,IPC EXCL等权限组合
- 若创建消息队列,key可以指定键值,也可以设置为IPC_PRIVATE(0)。若打开进行查询,则key不能为0,必须是一个非零的值,否则查询不到
信号量集控制
#include <sys/msg.h>
int semctl(int semid,int semnum,int cmd,...//信号量集数组);
//返回:成功返回0,出错返回-1
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
}
- 参数
- semid:信号量集ID
- semnum:0表示对所有信号量操作,信号量标号从0开始。
- val:防止获取或设置信号量集中某个信号量的值
- buf:信号量属性指针
- array:防止获取或设置信号量集中所有信号量的值
- cmd
- IPC_STAT:获取信号量的属性,取此队列的semid_ds结构,并放在buf指向的结构中
- IPC_SET:设置属性,按由buf只想的结构中的值,设置与此信号量相关的结构中的字段
- IPC_RMID:删除信号量,从系统中删除该信号量以及信号量上的所有数据。
信号量集操作
#include<sysm.h>
int semop(int semid,struct sembuf *sops,size_t nsops);
//成功返回0,失败返回-1
struct sembuf
{
unsigned short sem_num; //信号量集标号
short sem_op; //操作
short sem_flg; //
}
- 参数
- semid:信号量集ID
- sops:sembuf结构体数组指针
- nsops:第二个参数中结构体数组的长度
- sem_num:信号量集中信号量的编号
- sep_op:正数为v操作,负数为p操作,0表示对共享资源是否已用完的测试
- sem_flg:SEM_UNDO标志,表示进程结束时,相应的操作将被取消,如果设置了该标志,那么在进程没有释放共享资源就退出时,内核将代为释放。
- 用于信号量集中信号量的PV操作
- 可用于进程见的互斥和同步
IPC 进程间通信方式——信号量的更多相关文章
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- IPC 进程间通信方式——共享内存
共享内存 共享内存区域是被多个进程共享的一部分物理内存. 多个进程都可以把共享内存映射到自己的虚拟空间.所有用户空间的进程要操作共享内存,都要将其映射到自己的虚拟空间,通过映射的虚拟内存空间地址去操作 ...
- Linux下进程间通信方式——信号量(Semaphore)
1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据 ...
- IPC 进程间通信方式——消息队列
消息队列 消息队列是内核中的一个链表 用户进程将数据传输到内核后,内核重新添加一些如用户ID.组ID.读写进程的ID和优先级等相关信息后并打包成一个数据包称为消息 允许一个或多个进程往消息队列中读写消 ...
- Linux进程间通信(IPC)之信号量
[Linux]进程间通信(IPC)之信号量详解与测试用例 2017年03月22日 17:28:50 阅读数:2255 学习环境centos6.5 Linux内核2.6 进程间通信概述 1. 进程通信机 ...
- unix进程间通信方式(IPC)
unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...
- Nucleus进程间通信(IPC)方式
版权声明:本文为博主原创文章,未经博主同意不得转载--"http://blog.csdn.net/suipingsp". https://blog.csdn.net/suiping ...
- UNIX:高级环境编程 - 第十五章 IPC:进程间通信
IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信. 1.管道 1.1管道特点: (1)半双工的(即数据只能在一个方 ...
- 【转】进程间通信方式总结(windows 和linux)
平时看的书很多,了解的也很多,但不喜欢总结,这不昨天面试的时候被问到了进程间通信的方式,因为没有认真总结过,所以昨天答得不是特别好.现在将linux和windows的进程间通信方式好好总结一下. ...
随机推荐
- PAT B1023 组个最小数(20)
题目描述 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的 ...
- 同一台服务器请求easyswoole的一个websocket接口报错
求助大神啊!file_get_contents报这个错:failed to open stream: Connection timed out换成curl又报这个错:couldn't connect ...
- logid让你的请求完整可追溯
今天是在博客园开园的第一天 一时间其实并不能想起来到底该写什么文章,其实想写的东西挺多 今天就以logid这个主题开始吧,网上写这个的文章似乎不多,但是的确是在实际生产中相当重要的一个能力,也是容易被 ...
- navicat 使用 pymysql模块
新健库 ,新增字段+类型+约束 设计表:外键(自增) 新建查询 建立表模型 /* 数据导入: Navicat Premium Data Transfer Source Server : localho ...
- java 序列化和反序列化的底层实现原理
出处:序列化和反序列化的底层实现原理是什么? 一.基本概念1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过 ...
- python函数篇0-2
函数的有三中不同的参数: 普通参数 默认参数 动态参数# ######### 定义函数 ######### # name 叫做函数func的形式参数,简称:形参def func(name): p ...
- 《深入实践C++模板编程》之三——模板参数类型详解
非类型模板参数 和 模板型模板参数 整数以及枚举类型:指向对象或者函数的指针:对对象或函数的引用:指向对象成员的指针.统称为非类型模板参数. 模板型模板参数,是指模板参数还可以是一个模板. 1.整 ...
- java实现spark常用算子之Take
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...
- 闭包问题for(var i=0;i<10;i++){ setTimeout(function(){ console.log(i)//10个10 },1000) }
for(var i=0;i<10;i++){ setTimeout(function(){ console.log(i)//10个10 },1000) } 遇到这种问题 如何用解决呢 for(v ...
- Spring的核心jar包
Spring的主要jar包 四个核心jar包:beans.context.core.expression Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring ...