当前位置: 首页 > 编程日记 > 正文

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 消息队列标识符:删除某一个消息队列

相关文章:

7 自动开启网卡_淘汰的旧手机别扔掉,这样设置变身4G上网卡

很多人都用过usb无线上网卡,把手机SIM卡插到上网的卡槽内,然后把usb上网卡插到电脑usb口,电脑安装好驱动程序后,即可畅游网络世界。当初3G上网卡价格不菲,随着更新换代4G快要过去,5G开始试商用,…

Struts2 的stream result用法

2019独角兽企业重金招聘Python工程师标准>>> <action name"download" class"com.unmi.action.DownloadAction"> <result name"success" type"stream"><!--type 为 stream 应用 StreamResult 处理-->…

Largest Rectangle in a Histogram

ps&#xff1a;单调栈&#xff0c;注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

IPC--共享内存

有了之前的学习经验&#xff0c;共享内存对我们学习起来相对简单一些了&#xff0c;这里简单说说共享内存的一些&#xff0c;然后对于函数的分析直接在代码里面的注释部分有说明&#xff0c;如果还是不懂&#xff0c;可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解 …

2020年行政区划代码_2020年柳州市行政区划,了解柳州市有几个区,详细数据

本文通过整理了柳州市行政区划代码数据及柳州市统计用的城乡划分代码&#xff0c;带你了解柳州市有几个区、县及下面的街道和镇划分详细情况。柳州市有几个区、县、县级市&#xff1f;答&#xff1a;柳州市有5个区、5个县(行政区划2020年7月)。分别为&#xff1a;城中区、鱼峰区…

sql2000 转sql2008

1&#xff0c;在sql2008服务器上新建空数据库&#xff0c;与sql2000同名&#xff0c;当然可以不同名。 2&#xff0c;在sql2008服务器上选择数据库&#xff0c;点右键&#xff0c;任务-导入数据。打开导入数据向导。 3&#xff0c;点击下一步&#xff0c;选择数据源。数据源可以…

linux下查看网卡型号

查看网卡型号[rootcentos /]# lspci | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)我这里型号是79c970,驱动pcnet32.查看驱动信息[rootcentos /]# modinfo pcnet32filename: /lib/modules/2.6.18-194.el5/…

linux_域名映射

vi /etc/hosts在最后加上ip及映射的域名192.168.229.111 node001192.168.229.112 node002192.168.229.113 node003 转载于:https://www.cnblogs.com/lxyuuuuu/p/9578659.html

地址解析协议ARP

设计需求 ARP协议解决的问题就是&#xff1a;在同一个局域网中&#xff0c;解决主机IP地址和硬件地址的映射问题 基本使用原理 当数据在网络中某一条链路传输的时候我们知道目的主机的IP地址&#xff0c;但是不知道硬件地址&#xff0c;ARP协议就是解决这个问题的一个协议&a…

ie8加载js太慢_js ie8 慢

Re请教ap6214f2r版主一些问题引用第2楼ap6214f2r于2012-09-10 14:08发表的 :楼主&#xff0c;关于你说的慢&#xff0c;我去看了下你网站响应速度非常快[attachment26863]这个请求是计算签名&#xff0c;跳转到OSS的。.......老大&#xff0c;我刚才试了一下&#xff0c;不是线…

LINQ : IEnumerableT and IQueryableT区别

本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据&#xff0c;显示如下&#xff1a; 下面这条语句使用数据库里的EF数据&#xff0c;显示如下&#xff1a; 针对Linq “LINQ TO to OBJECTS”&#…

九大网络安全失误,需要注意

在我们的职业生涯中大都曾经有过一次这样的经历——我是说你认为足以让你丢掉饭碗的失误。我的第一次重大失误是曾经重启了校园里的所有路由器&#xff0c;不是一个接一个的&#xff0c;而是所有一次完成。我写了一个脚本&#xff0c;为所有的路由器安装一个安全更新&#xff0…

python学习笔记——Thread常用方法

http://blog.sina.com.cn/s/blog_4b5039210100ewie.html Thread对象中的一些方法&#xff1a; 以前说过多线程&#xff0c;用到threading模块中的Thread对象&#xff0c;其中的start和run方法比较熟悉了&#xff0c;start&#xff08;&#xff09;是重载了Thread对象中的run方法…

常见的路由选择算法

一、路由表 所谓路由表&#xff0c;指的是路由器或者其他互联网网络设备上存储的表&#xff0c;该表中存有到达特定网络终端的路径&#xff0c;在某些情况下&#xff0c;还有一些与这些路径相关的度量。 二、常见路由表生成算法 路由算法是提高路由协议功能&#xff0c;尽量…

linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计

本嵌入式网络摄像机采用高性能ARM9芯片微处理器&#xff0c;内置嵌入式Web服务器。通过嵌入式多任务操作系统采集摄像机视频数据&#xff1b;采集的视频信号数字化后经MJPEG算法压缩&#xff0c;再通过内部总线送到内置的Web服务器&#xff1b;使用者可以直接用浏览器观看Web服…

2012 ARM嵌入式开发应用研讨会杂谈

记得以前参加的ARM的研讨会&#xff0c;名称是技术研讨会&#xff0c;不知道为什么现在改名为嵌入式开发应用研讨会了。不过今年演讲的重点就是 ARM DS-5开发工具&#xff08;还免费发放了一本《Linux/Android开发利器 ARM DS-5使用指南》书籍&#xff09;&#xff0c;也许这就…

打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

此文章参考《深入理解计算机系统》P31。 先看如下代码&#xff1a; 12345的十六进制表示为&#xff1a;0x00003039 1 #include <stdio.h>2 3 int main()4 {5 int a 12345;6 char *q (char *)(&a);7 for(int i 0; i < sizeof(a); i)8 prin…

NAT技术和代理服务器

一、代理服务器 所谓“代理”&#xff0c;就是代而劳之的意思。代理服务器就是代理网络用户去取得网络信息&#xff0c;形象的说&#xff1a;它是网络信息的中转站&#xff0c;使得一个网络终端和另一个网络终端不直接进行相连&#xff0c;代理网络用户去取得信息。主要工作在O…

链接全局变量再说BSS段的清理

废话就不多说了&#xff0c;开始。。。 再说BSS段的清算 以前遇到一个裸机程序不能改变全局变量值的问题&#xff0c;最后模模糊糊处理了&#xff1a;手动添加了一个链接脚本&#xff0c;清算了BSS段。问题得以处理&#xff0c;就认定是BSS段清算的问题&#xff0c;全局变量在B…

ios启动页尺寸_关于移动端App启动页的策划方案

App启动页是指app在启东时需要加载必要的运行环境和配置&#xff0c;在这个过程中提示用户等待的一个过渡页面。在产品经理眼里启动页是app给予用户重要的第一印象&#xff1b;也是App最重要的黄金页面之一&#xff0c;所有用户100%都会看到的页面。启动页适合用来做以下几个事…

事件流--事件冒泡现象及阻止

事件冒泡现象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件冒泡现象</title><style>div{padding: 50px;}#div1{background: red;}#div2{background: blue;}#div3{background: yell…

谁知道静态成员的纠结心境

我们在实际开发的过程中&#xff0c;可能需要某些类的成员变量并不是针对每一个对象的&#xff0c;而是针对每一个类而言的&#xff0c;比如在银行中有一个利率数据&#xff0c;我们希望的是&#xff0c;当一个利率改变的时候&#xff0c;所有的对象都能够看到这个改变的数据&a…

.net ConfigurationSectionDesigner插件使用

最近接触了vs2010的一款插件&#xff1a;ConfigurationSectionDesigner。ConfigurationSectionDesigner是一个图型化设计.net的配置块和自动生成需要代码和schema定义的codeplex上的一个开源项目&#xff0c;现在分享出来&#xff0c;希望对大家有所帮助。 .Net配置体系中可以是…

对应到对象 数据库驼峰_【GI的自主空间数据库】一种竞争力,叫技术引领;一种竞争力,叫时间沉淀...

引子&#xff1a;GI的自主空间数据库及GIS框架来自于求学时MAPGIS的引导&#xff0c;工作时ARCGIS的追随&#xff0c;读博时IBM和Microsoft2篇文献...。即使在大数据技术发展的今天&#xff0c;自主空间数据库存储仍然有其技术优势&#xff0c;近20年的时间沉淀&#xff0c;是G…

TSM备份Windows数据

一、备份数据 1.使用备份勾当客户端&#xff0c;可以在原始文件出现损坏的时候&#xff0c;恢复备份版本。TSM提供备份和恢复文档的类型包括:FAT&#xff0c;NTFS和FAT32.2.合适备份和合适归档文件当备份-归档客户端备份或归档一个文件&#xff0c;他会发送一份文档的副本和它的…

GM Tech 2 works with Hummer Yes or No

This is about GM Tech 2 scan tool for Hummer troubleshooting and programming. Can I have a cheap Tech 2 for Hummer? Yep. Both the original and HQ clone can work for your car. Where can I get a working clone at a good price? https://www.obd2tool.com/goods…

程序的编译和链接过程

一.虚拟机、linux简介简单介绍一下虚拟机还有就是各种操作系统&#xff0c;比如centos&#xff0c;Ubuntu操作系统&#xff1a;linux&#xff08;centos、Ubuntu、redhat&#xff09;&#xff0c;Android&#xff0c;Windows&#xff08;xp、win8、win10&#xff09;进程&#…

Nosql网络阅读

#1 Node.jsmongodb 开源项目 https://github.com/DoubleSpout/wujb  作者博客:http://snoopyxdy.blog.163.com/blog/static/60117440201261844125973/ #1 关系数据库还是NoSQL数据库 NoSQL的分类 NoSQL仅仅是一个概念&#xff0c;NoSQL数据库根据数据的存储模型和特点分为很多…

python 文案自动生成_Python自动化测试如何自动生成测试用例?

原文作者&#xff1a;陈安妮annie1原出处&#xff1a;简书上文内容不用于商业目的&#xff0c;如涉及知识产权问题&#xff0c;请权利人联系博为峰&#xff0c;我们将立即处理。传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来&#xff0c;通过断言判断是否和预…

Linux下图解minicom安装

Linux下图解minicom安装 minicom是一个串口通信工具&#xff0c;就像Windows下的HyperTerminal。可用来与串口设备通信&#xff0c;如调试交换机和Modem等。它的Ubuntu软件包的名称就叫minicom&#xff0c;用apt-get install minicom即可安装。全文见附件pdf