Linux 进程间通信——信号量

news2025/1/23 2:06:49

一、信号量描述

信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目。

获取资源时,需要对信号量的值进行原子减一,该操作被称为P操作,当信号量值为0时,代表没有资源可用,P操作会阻塞。释放资源时,需要对信号量的值进行原子加一,该操作被称为V操作。

信号量主要用来同步进程。

信号量的值如果只取0,1,将其称为二值信号量;如果信号量的值大于1,则称之为计数信号量。

临界资源:同一时刻,只允许被一个进程或线程访问的资源
临界区:访问临界资源的代码段

二、信号量使用

1.操作信号量的接口介绍

(1)semget()

int semget(key_t  key, int nsems, int semflg); 

semget()创建或者获取已存在的信号量
semget()成功返回信号量的ID, 失败返回-1
key:两个进程使用相同的key值,就可以使用同一个信号量
nsems:内核维护的是一个信号量集,在新建信号量时,其指定信号量集中信号量的个数
semflg可选:IPC_CREAT IPC_EXCL

(2)semop()

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

semop()对信号量进行改变,做P操作或者V操作
semop()成功返回0,失败返回-1
semid:信号量的id
struct sembuf *sops

struct sembuf  
{  
unsigned short sem_num;  //指定信号量集中的信号量下标  
short          sem_op;   //其值为-1,代表P操作,其值为1,代表V操作  
short          sem_flg;  //SEM_UNDO  当程序执行了p操作崩溃了之后,系统帮忙将该信号量释放掉
}; 

(3)semctl()

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

semctl()控制信号量
semctl()成功返回0,失败返回-1
cmd选项: SETVAL IPC_RMID

semnum

union semun  
{  
int             val;  
struct semid_ds *buf;  
unsigned short  *array;  
struct seminfo  *_buf;  
}; 

2.封装信号量接口并在程序中使用信号量

例题:进程a和进程b模拟访问打印机,进程a输出第一个字符‘a’表示开始使用打印机,输出第二个字符‘a’表示结束使用,b进程操作与a进程相同。(由于打印机同一时刻只能被一个进程使用,所以输出结果不应该出现abab),如图所示:

在这里插入图片描述
(1)封装信号量的接口:

sem.h的代码如下:

在这里插入图片描述

sem.c的代码如下:

在这里插入图片描述
在这里插入图片描述

b.c的代码如下:

在这里插入图片描述

a.c的代码如下:

在这里插入图片描述

运行结果如下图所示:

在这里插入图片描述

【注意】信号量的创建和销毁只有一次就好了。如果信号量没有被创建,那么创建一个信号量,如果信号量被创建了,就获取也就创建的信号量。信号量的销毁也一样,仅销毁一次就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023一建案例100题

一、某施工单位承接了两栋住宅楼,总建筑面积 65000m,均为筱板基础(上翻梁结构),地下 2层,地上30 层,地下结构连通,上部为两个独立单体一字设置,设计形式一致,地下室外墙南北向距离 4…

008永磁电机FOC控制:磁场定向控制不就两个变换就搞定啦

在现代工业中,电机广泛应用于各类设备和机械系统中。为了提高电机性能并降低能量损耗,电机控制技术得到了不断的发展和创新。其中,磁场定向控制(Field-Oriented Control,简称FOC)作为一种先进的电机控制策略…

在 IDEA 中使用 Git开发 图文教程

在 IDEA 中使用 Git开发 图文教程 一、连接远程仓库二、IDEA利用Git进行开发操作三、分支操作3.1 新建分支3.2 切换分支3.3 删除分支3.4 比较分支3.5 合并分支 四、常用快捷键 一、连接远程仓库 一、打开IDEA,进入目录:File ->New ->Project from…

PHP之Base64+php://filter绕过、disabled_function绕过

目录 一、Base64php://filter绕过 1.思路分析 2.实践验证 二、disabled_function绕过 一、Base64php://filter绕过 上课讲了这样一道题&#xff0c;一起来看下(以下代码适用于PHP7.x及以上&#xff0c;5的版本会报错) <?php function fun($var): bool{$blacklist …

STM32 中断复习

中断 打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 在确定时间内对相应事件作出响应&#xff0c;如&#xff1a;温度监控&#xff08;定时器中断&#xff09;。故障处理&#xff0c;检测到故障&#x…

详细讲解什么是SpringMVC 映射请求数据

&#x1f600;前言 本文详细讲解什么是SpringMVC 映射请求数据 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f609; …

2023年03月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字字符求和 请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536 输入 一行字符串,长度不超过100,字符串中不含空格。 输出 字符串中所有数字字符作为数的和 样例输入 Lsd2f02k3ja3sdf223 样例…

辅助笔记-安装Ubantu虚拟机

安装Ubantu虚拟机 文章目录 安装Ubantu虚拟机步骤一&#xff1a;检查BIOS虚拟化支持步骤二&#xff1a;VMware17安装虚拟机步骤1&#xff1a;新建虚拟机步骤2&#xff1a;验证虚拟机能否上网 步骤3&#xff1a;设置Ubantu语言为中文 本文主要参考B站视频“P108_ 韩顺平Linux_ u…

测评类软文怎么写?教你几招

测评类种草软文&#xff0c;是当下非常热门的一种文章类型。这类文章以其独特的魅力&#xff0c;吸引着大量的用户&#xff0c;同时也让许多商家看到了商机。然而&#xff0c;如何写好一篇测评类种草软文&#xff0c;却是许多企业和品牌面临的难题。接下来伯乐网络传媒就给大家…

如何制作gif动图表情包?教你一键在线生成gif动图

使用gif表情的时候&#xff0c;经常发现市面上的表情包不太符合自己的需求&#xff0c;这时候我们可以动手制作自己的表情包&#xff0c;如何才能快速完成gif图片制作呢&#xff1f;今天就教大家一个不用下载安装任何软件的方法&#xff0c;使用专业的在线gif生成功能来制作gif…

代码随想录第24天|初步了解回溯三部曲

回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 所以以下讲解中&#xff0c;回溯函数也就是递归函数&#xff0c;指的都是一个函数。 提到了回溯法的效率&#xff0c;回溯法其实就是暴力查找&#xff0c;并不是什么高效的算法。 最后我们讲到回溯法解决的问题都可以…

SIP网络音频模块-sip网络对讲音频模块(提供POE受电模块接口)

SIP网络音频模块-sip网络对讲音频模块&#xff08;提供POE受电模块接口&#xff09; SIP网络音频模块SV-2401V网络对讲音频模块&#xff08;支持POE&#xff09; SV-2403V网络对讲音频模块_网络语音对讲模块 网络音频模块 双向对讲 SIP广播系统 SIP网络音频模块嵌入式网络对…

花生十三 判断推理(四)定义判断、类比推理

定义判断 解题思路&#xff1a; 不是单纯的连连看&#xff0c;重在理解&#xff0c;可联系生活中的人或事或某种现象 题型特征&#xff1a;“被定义词” 解释 关键信息 “被定义词” &#xff1a;因名包含有重要特征特别关注&#xff1a;主体、对象、特殊要求、中心语 选…

真香!主数据管理系统,企业大哥必备神器

什么是主数据&#xff1f; 当一家连锁商超企业的市场营销部门想要策划一场线上线下营销活动&#xff0c;从而为消费者提供便捷的购物体验&#xff0c;就需要掌握商超会员的数据。 要想拥有这些数据就需掌握顾客的交易行为&#xff0c;掌握其购物过程行为&#xff0c;甚至情感…

Serverless 应用托管助力企业加速创新

作者&#xff1a;熊峰 云原生时代的 Serverless 应用托管架构 回顾过去十年&#xff0c;数字化转型将科技创新与商业元素不断融合、重构&#xff0c;重新定义了新业态下的增长极。商业正在从大工业时代的固化范式进化成面向创新型商业组织与新商业物种的崭新模式。随着数字化转…

操作符详解上(非常详细)

目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符&#xff1a;&、|、^逗号表达式 二进制介绍 在初学计算机时我们常常会听到2进制、8进制、10进制、16进制……

PiplineADC学习一:

PiplineADC结构&#xff1a; PiplineADC起源之FlashADC PiplineADC起源之Sub-Ranging-ADC 比较器存在失调&#xff1a; 因此每级1bit不实用&#xff0c;需要做冗余位设计。 多比较一次&#xff0c;两个阈值&#xff0c;三个区间&#xff0c;分别对于输出00,01,10。正常2bit应该…

通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项

众所周知&#xff0c;我们是访问不通OpenAI官方服务的&#xff0c;但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用&#xff0c;所以我们需要使用国内的大模型接口 国内的效果真的很差&#xff0c;现在如果想使…

mybatis-plus的count方法突然失效的一个场景案例

在添加数据之前&#xff0c;做了名称重复的校验 明明在数据库里面查看了下刚加的名称是没有的&#xff0c;结果count的数据量不是0&#xff0c;而是一个意外的数据&#xff0c;明明之前是好的。 此时我以为是mybatis-plus查询出问题了&#xff0c;我马上用一样的参数条件。lis…

如何在网页下载腾讯视频为本地MP4格式

1.打开腾讯视频官网地址 腾讯视频 2.搜索你想要下载的视频 3. 点击分享,选择复制通用代码 <iframe frameborder="0" src="ht