首页 > IPC--信号量

IPC--信号量

信号量概念理解

  • 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是0或者是1,即是要么是有,要么是无。信号量本身也是临界资源,所以一定要保证其原子性。
  • 信号量的工作原理:两个进程共享一个信号量sv,一个进程访问的sv的时候,进行的是P操作即是减1操作,开始的时候信号量是1,它得到信号量进入临界资源。当他出来的时候进行v操作,使信号量加1。其他的进程访问的时候看见信号量是0,就不在访问了。
  • 现实形象比喻:比如我们的信号量是一个教室的,教室里面有很多座位,这就是临界资源。咱们设计是50,一开始同学想进教室的时候得去申请,比如现在门口站了一个人,它就是控制信号量的,第一个人进去的时候,使用P操作,将50减1,出来的时候加1,如果信号量是>0的 就可以进去,否则就不可以进去
  • 信号量 不以传送数据为目的,它是以协调使用临界资源进行 进程间通信为目的的,当我们申请信号量的时候,就可以得到信号量保护的临界资源。

信号量相关函数的使用

得到信号量(生成信号量)

int semget(key_t key,int nsem,int semflg)

参数解析

- key:这是一个key值,可以理解为一个端口,这个用函数ftok生成,一会介绍

- nsem:信号量的个数

- semflg:创建信号量的方式,它由两个固定标识位参数可以选择。如果是IPC_CREAT,表示如果有一个信号量则返回,如果没有则创建。IPC_EXCL,如果单独使用它没有任何的意义,但是如果和IPC_CREAT一起使用,就是IPC_CREAT|IPC_EXCL表示如果有信号量则出错返回,如果没有则创建,这样就可以保证我们每次使用的时候创建的是一个全新的信号量

返回值

如果失败返回-1,如果成功返回信号量标识符(信号量ID)

删除信号量

int semctl(int semid,int semnum,int cmd,...)

参数:

- semid:这个是删除的信号量的标识符(ID)

- semnum:这个是删除的信号量的个数,这里暂时设置0

- cmd:执行命令的方式,这里我们主要是为了删除一个信号量,可以直接使用IPC_RMID

初始化信号量

int semctl(int semid,int semnum,int cmd,...)
  • semid:这个是初始化信号量的标识符(ID)
  • semnum:这个是初始化信号量中的第几个信号量,数组下标的形式
  • cmd:执行命令的方式,这里我们是初始化信号量,传入的是特定的参数SETVAL,传入这个信号量的时候,需要传入第四个参数,这个参数应该是一个联合体,联合体的结构如下
union semnu{int val; // 使用的值struct semid_ds *buf; // IPC_STAT、IPC_SET 使用缓存区unsigned short *array; // GETALL,、SETALL 使用的数组struct seminfo *__buf; // IPC_INFO(Linux特有) 使用缓存区
};

我们在使用semctl进行 信号量初始化的时候,首先得先用上面的联合体定义一个对象,然后这个联合体是需要我们自己定义的,然后把实例化的这个对象的val设置为1(这里我们使用的是二元信号量)

函数使用示例:

union semnu _semnu;

semctl(semid,semnum,SETVAL,_semnu);

返回值:失败返回-1

信号量Pv操作

int semop(int semid,struct sembuf* sops,unsigned nsops)

参数

- semid:信号量标识符

- sops:这个也是需要我们提前实例化一个对象,这里我们可以传递的是一个结构体数组,也可以是一个结构体的地址

- nspos:是结构体的个数,因为上一个参数是一个数组

这里第二个参数也是一个结构体,这个结构体是系统自定义的结构体,不需要我们定义,我们可以直接调用它,这里结构体的内容 如下

struct sembuf{unsigned short sem_num;short sem_op;short sem_flag;
};

num:标记信号量集中的第几个

sem_op:标记是那种操作,比如二元信号量p设置为-1,如果是v操作设置为1

sem_flag:我们此时默认设置为0

讨论信号量的几种情况

  • 当我们的某一个进程已经进行 p操作,拿到信号量维护的共享资源之后,这个时候可以有一种可能该进程被其他进程替换掉了,但是这个时候信号量依然被该进程拿着,等它下一次切换进来的时候还可以继续原来的操作
  • 另外的一种情况是,某一进程拿到信号量之后,因为某些原因被杀死,这个时候信号量还在改进程里面,其他的进程就无法获得该信号量,这个情况就是问题所在。这个时候我们可以设置信号量的的结构体,就是上面的结构体sem_flag,可以把它设置为SEM_UNDO,这个时候进程退出的时候,它所拿到的信号量就会释放掉,比如二元信号量原来是0,如果使用这个选项后,当进程退出后就会变成是1。

补充两个linux的指令:

- ipcs -s :查看当前信号量

- ipcrm -s 信号量标识符:删除某一个信号量

- ipcs -q:查看当前消息队列数

- ipcrm -q 消息队列标识符:删除某一个消息队列

更多相关:

  • 空闲态:这时候手机只能使用一路信号,应该是最强的那一路。手机在空闲态时不断地搜索各个导频的强度,如果搜到比当前使用的导频更强的,那么它就自发的进行切换。这个切换的过程是手机自发的过程,不需要基站的参与。业务态:手机最多可以使用3路导频信号,并且将这3路导频信号进行最大比合并,也就是说将3个信号合并成更强的信号。如果手机测量到有更强的导...

  • 文章目录概念描述通信原理编程接口使用流程编程案例 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步本质:内核维护的一个正整数,可对其进行各种+/-操作分类:systemV 信号量、POSIX 有名信号量、POSIX 无名信号量用途:用来标示系统中可用资源的的个数,协调各个进程有序的访问资源,防止发生冲突...

  • osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 每层运行常见的物理设备 我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议 就理解了整个互联网通信的原理。 首先,用户感知到的只是最上面一层应用层,自上而下每层都依赖于下一层,所...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...

  • 英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...

  • 展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...

  • 前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...

  • 【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...

  • 点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...