嵌入式 Linux进程间通信之信号量

news2025/1/27 12:36:12

目录

一、信号量

1、信号量概述

2、什么是信号量 

3、信号量的分类

4、进程获取共享资源要执行的操作 

 5、System V IPC 机制:信号量

5.1 semget函数

5.2 semop函数

5.3 semctl函数


一、信号量

1、信号量概述

信号量集:由若干个信号组成的集合;

信号量:是信号量集的一个元素;

每个信号量都有它的值:非负整数。

同时每一个信号量也有他在这个信号量集中的编号,就好比数组中的每一个元素都有标一样,数组下标从0开始,信号量也是从0开始;总结:信号量和数组很像。

2、什么是信号量 

  信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原 语。一般还用来对某个共享资源的进行访问控制。

  信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个进 程/线程运行,这种工作就需要一个二进制开关;有时候需要限制一段代码可以被多少个进程/线 程执行,这就需要用到关于计数信号量。信号量开关是二进制信号量的一种逻辑扩展,两者实际 调用的函数都是一样。

3、信号量的分类

信号量分为以下三种:

1)System V 信号量,在内核中维护,可用于进程或线程间的同步,常用于进程的同步。

2)Posix 有名信号量,一种来源于 POSIX 技术规范的实时扩展方案(POSIX Realtime Extension) ,可用于进程或线程间的同步,常用于线程。

3)Posix 基于内存的信号量,存放在共享内存区中,可用于进程或线程间的同步。

4、进程获取共享资源要执行的操作 

为了获得共享资源,进程需要执行下列操作:
1)测试控制该资源的信号量。

2)若信号量的值为正,则进程可以使用该资源。然后将信号量值减 1,表示它使用了一个资

源单位。此进程使用完共享资源后对应的信号量应该加 1。以便其他进程使用。

3)若对信号量进行减一时,信号量的值为 0,则进程进入阻塞休息状态,直至信号量值大于 0。

进程被唤醒,返回第(1)步。
为了正确地实现信号量,信号量值的测试及减 1 操作应当是原子操作(原子操作是不可分割

的,在执行完毕不会被任何其它任务或事件中断)。为此信号量通常是在内核中实现的。

 5、System V IPC 机制:信号量

相关的函数的头文件如下:

#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>

5.1 semget函数

函数原型

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

函数功能

创建一个信号量集或访问一个已存在的信号量集。

参数1)key是唯一标识一个信号量的关键字。如果为IPC_PRIVATE(值为0,创建一个只有创建者进程才可以访问的信量,

示创建一个只由调用进程使用的信号量;
非 0 值的 key(可以通过 ftok 函数获得)表示创建一个可以被多个进程共享

的信号量。 2)nsems:需要使用的信号量数目。

如果是创建新集合,则必须指定 nsems。

如果引用一个现存的集合,则将 nsems 指定为 0。 3)flag:是一组标志,其作用与 open 函数的各种标志很相似。

A-它低端的九个位是该信号量的权限,其作用相当于文件的访问权限。 B-此外,它们还可以与键值 IPC_CREAT 按位或操作,以创建一个新的信号量。 C-即使在设置了 IPC_CREAT 标志后给出的是一个现有的信号量的关键字,也并

不是一个错误。
D-我们也可以通过 IPC_CREA 和 IPC_EXCL 标志的联合使用确保自己将创建的一个新的独一无二的信号量来,如果该信号量已经存在,那么就返回一个错误;

返回值成功时,返回一成为信号量集标识符的整数,semop和semct会使用它;出错时,返回-1;

5.2 semop函数

第二个参数详细说明:

sops:指向一个结构体数组的指针。可以指向单个或者多个结构体变量。每个数组元素至少包

含以下几个成员;

这段话很关键,他可以一次对一个信号量进行操作,此时数组长度为1,也可以一次多个信号量。如果一次操作多个信号量,每个信号量按照这个数组的各个元素执行的编号和值进行可操作。

5.3 semctl函数

函数原型

int semctl(int semid, int semnum, int cmd, union semun arg);

函数功能用来直接控制信号量信息
参数

semid :由 semget 返回的信号量标识符。
semnum :要进行操作的集合中信号量的编号,当要操作到成组的信号量时,从 0 开 始。一般取值为 0,表示这是第一个也是唯一的一个信号量。
cmd 为执行的操作。
arg 是一个 union semun 类型(具体的需要由程序员自己定义)。

返回值成功返回0,失败返回-1

实例:编写一个关于信号量的直观易懂的程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
union semun {
};
/* Value for SETVAL */
 /* Buffer for IPC_STAT, IPC_SET */
int val;
struct semid_ds *buf;
unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf;
void sem_wait(int semid)
{
struct sembuf sem; sem.sem_num=0; sem.sem_op= -1; sem.sem_flg=SEM_UNDO; semop(semid,&sem,1);
}
void sem_post(int semid) //信号量释放
{
   struct sembuf sem;
   sem.sem_num=0;
   sem.sem_op= 1;
   sem.sem_flg=SEM_UNDO;
   semop(semid,&sem,1);
}
int main() {
int semid;
//信号量获取
//信号量释放
pid_t id;
union semun sem_un;
semid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
if(semid==-1){
   printf("error:semid\n");
return -1;}
sem_un.val = 3;
semctl(semid,0,SETVAL,sem_un); //通过 semctl 给信号量赋初值 while(1)
{
sem_wait(semid); //等待获取信号量,如果有就往下执行,如果没有就等待 printf("helllo world\n"); //观察是否打印了三次
sleep(1);
}
return 0; }

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

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

相关文章

JUC并发编程之Semaphore-应用与深度源码剖析

目录 JUC并发编程之Semaphore-应用与深度源码剖析 1. Semaphore 是什么&#xff1f; 2.怎么使用Semaphore&#xff1f; 2.1构造方法 2.2 重要方法 2.3 基本使用 需求场景 基础版代码实现 tryAcquire()引入代码实现 acquireUninterruptibly(),acquire()对比代码实现 3.…

【C++】C++11——简介|列表初始|简化声明|nullptr与范围for|STL中的变化

文章目录一、C11简介二、列表初始化三、简化声明四、nullptr与范围for五、STL中一些变化一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于TC1主要是对C98标准中的漏洞进行修复…

Easyrecovery16免费的电脑硬盘恢复数据软件

在我们的日常生活和工作中&#xff0c;很容易发生一些意外情况&#xff0c;比如误删文件。这种情况下&#xff0c;您可能会感到非常困惑和担心&#xff0c;担心文件已经永久丢失&#xff0c;无法恢复。但是&#xff0c;在大多数情况下&#xff0c;即使您误删了文件&#xff0c;…

Nativefier把网页打包成exe

前要&#xff1a; 今天遇到一个需求&#xff0c;之前的应用都是用的h5挂载在企业微信的小应用&#xff0c;但是现在需要电脑运行的exe安装包&#xff01; 所以需要用到nativefier导报工具&#xff1a;nativefier是一个使用electron将网页转换为app的插件&#xff0c;写这篇博客…

二、SpringMVC注解式开发

1. RequestMapping注解 此注解就是来映射服务器访问的路径 可加在方法上,是为此方法注册一个可以访问的名称(路径) 可以加在类上,相当于是包名(虚拟路径),区分不同类中相同的action的名称 可区分get请求和post请求 package com.powernode.controller;import org.springframe…

liunx下安装node exporter

1 建立文件夹 cd /opt mkdir software 下载最新的包&#xff0c;并解压 https://prometheus.io/download/ 下载 curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz 3.解压 tar -xvf node_exporter-0.…

Gorm根据关系模型中的属性查询原模型数据

type ExamResult struct {gorm.ModelExamManagementID uintExamManagement ExamManagement json:"examManagement" // 一场考试&#xff0c;其中有试卷&#xff0c;有试题&#xff0c;有试题答案//MarkExamPaperRecord MarkExamPaperRecord //每一场考试对应的结…

测试经理:“你做了三年测试,连服务端的接口测试都不会?”

服务端的接口测试我们一般从功能开始进行测试&#xff0c;比如请求参数和响应参数的校验&#xff0c;业务逻辑或业务规则的校验&#xff0c;数据库操作的校验。 功能正常后会根据需要进行安全相关的检查、性能测试以及系列扩展测试&#xff0c;比如与历史版本的兼容性测试、接…

【微信小程序】-- WXS 脚本(二十九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

【Java基础】Linux系统

CONTENT一、常用命令时间日期关机&重启登录&注销运行级别找回root用户密码&#xff08;CentOS 7&#xff09;二、文件管理显示当前工作路径显示文件和目录切换目录创建文件&目录删除文件&目录拷贝文件&目录移动文件&目录 / 重命名查找文件&目录查看…

java启动命令中-D和--的区别

目录一、java -D 添加参数二、java -- 添加参数在 SpringBoot 项目中&#xff0c;启动时&#xff0c;通过 -D 或 -- 添加参数&#xff0c;都可以直接覆盖 yml 或 properties 配置文件中的同名配置&#xff0c;如果不存在则相当于添加了一个配置。 一、java -D 添加参数 java -D…

【面试题】三道面试题让你掌握JavaScript中的执行上下文与作用域以及闭包

前言大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库大家好&#xff0c;笔者呢最近再回顾JavaScript知识时&#xff0c;又看到了JavaScript的一些较为常见的内容&#xff0c;仔细看了之后发现…

1-1 微服务架构概述

文章目录微服务架构概述1-1. 系统进化理论概述集中式系统&#xff1a;分布式系统1-2. 系统进化理论背景1-3. 什么是微服务架构1-4. 微服务架构的优缺点1-5. 为什么选择 Spring Cloud 构建微服务认识 Spring Cloud2-1. Spring Cloud 是什么2-2. Spring Cloud 的版本2-3 Spring C…

2.2操作系统-进程管理:前趋图、前趋图与PV操作

2.1操作系统-进程管理&#xff1a;前趋图\前趋图与PV操作前趋图前趋图与PV操作练习前趋图与PV操作&#xff0c;一般出现了&#xff0c;分值在2~3分左右&#xff0c;技巧性很强。 前趋图 前趋图是为了描述一个程序的各部分间的依赖关系&#xff0c;或者是一个大的计算的各个子…

【c++类与对象 】

目录&#xff1a;前言一、基础引入1.类的定义2.类的权限3.类的封装4.类的实例化5.计算类对象的大小结构体内存对齐规则空类的大小二、this指针this引入this指针的特性经典例题三、类的六个默认成员函数1、构造 && 析构构造函数析构函数2、拷贝 && 赋值拷贝构造…

display:inline-flex使用

凡是使用了display:inline-flex布局的容器&#xff08;不管是行内元素还是块级元素&#xff09;&#xff0c;将会变为弹性容器&#xff0c;它的宽高都将可以被设置&#xff0c;并且该容器整体对外表现为一个行内块元素。 span也可以设置宽高&#xff0c;并且div和span它们都没有…

【C++】缺省参数函数重载

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、缺省参数1.1 缺省参数的概念1…

关于new和delete的一些思考,为什么不能在析构函数中调用delete释放对象的内存空间,new和delete的原理

最近在写代码的时候&#xff0c;觉得每次new出来的对象都需要去delete好麻烦&#xff0c;于是直接把delete写到了析构函数中&#xff0c;在析构函数里面写了句delete this&#xff0c;结果调用析构函数的时候死循环了&#xff0c;不是很理解原因&#xff0c;于是去研究了一下。…

盘点全球10大女性技术先驱

盘点全球10大女性技术先驱 人们普遍认为技术是男性主导的领域&#xff0c;但事实&#xff0c;技术或编程与性别无关&#xff0c;几乎任何人都可以成为技术大神。已经有很多案例证明女性同样可以在技术领域施展才能。在女神节来临之际&#xff0c;我为大家盘点一下为编程做出卓越…

AB测试——流程介绍(定义问题和指标选取)

前言&#xff1a; 作为AB测试的学习记录&#xff0c;本文主要介绍了AB测试的基本流程&#xff0c;以及指标类型和如何选取合适指标。 相关文章&#xff1a;AB测试——原理介绍 AB测试的基本流程是什么&#xff1f; AB测试&#xff08;也称为分流测试&#xff09;是一种常用的实…