当前位置: 首页 > news >正文

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

目录

一、信号量

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; }

相关文章:

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

目录 一、信号量 1、信号量概述 2、什么是信号量 3、信号量的分类 4、进程获取共享资源要执行的操作 5、System V IPC 机制&#xff1a;信号量 5.1 semget函数 5.2 semop函数 5.3 semctl函数 一、信号量 1、信号量概述 信号量集&#xff1a;由若干个信号组成的集合&a…...

谷粒学院开发(一):基础准备

商业模式 常见商业模式 B2C模式&#xff1a; 两个角色&#xff1a; 管理员&#xff1a;增加&#xff0c;修改&#xff0c;删除普通用户&#xff1a;查询 商家到用户&#xff0c;自己制作大量自有版权的视频&#xff0c;放在自有平台上&#xff0c;让用户付费。 这是这个项目使…...

Photoshop如何安装ZXP扩展插件?

Photoshop如何安装ZXP扩展插件呢&#xff1f;有一些小伙伴不会安装&#xff0c;今天介绍两种安装ZXP扩展的方法&#xff0c;希望对能帮助到大家。方法一&#xff1a;手动安装方式1&#xff09;把下载好的.zxp扩展名改为.zip&#xff0c;然后解压。Windows系统&#xff1a;C:\Us…...

c++面试技巧-基础篇4

1.面试官&#xff1a;在使用继承时需要注意哪些问题&#xff1f; 应聘者&#xff1a;在使用继承时需要注意以下内容。 &#xff08;1&#xff09;父类的构造函数和析构函数是不会被继承的&#xff0c;需要重写派生类的构造函数和析构函数。 &#xff08;2&#xff09;派生类…...

openEuler用户软件仓(EUR)介绍

什么是 EUR EUR(openEuler User Repo)是openEuler社区针对开发者推出的个人软件包托管平台&#xff0c;目的在于为开发者提供一个易用的软件包分发平台。 链接&#xff1a;https://eur.openeuler.openatom.cn/ 为什么我们需要 EUR 在操作系统的世界&#xff0c;软件包是一等…...

MySQL的图形化界面开发工具DataGrip的下载安装

在日常的开发中&#xff0c;会借助于MySQL的图形化界面&#xff0c;来简化开发&#xff0c;提高开发效率。目前mysql主流的图形化界面工具&#xff0c;有Navicat、SQLyog、DataGrip等&#xff0c;最后一种DataGrip&#xff0c;这种图形化界面工具&#xff0c;功能更加强大&…...

Azure Portal 访问安全性增强

Azure Portal 访问安全性增强客户需求如何设置账号&#xff08;包括Admin&#xff09;定期修改密码&#xff0c;例如强制每90天必须修改密码如何设定账号密码的复杂性要求如何设定限制访问Azure Portal的源IP Address客户需求 为了增强访问Azure Portal的安全性&#xff0c;希…...

mysql安全值守数据库常用语句

目录1.用户权限设置mysql中用户如何定义2.元数据查询3.union查询详解4.分组查询展示5.字符串函数6.mysql数据库导入导出1.用户权限设置 mysql中用户如何定义 用户名主机域有以下几种表示方式&#xff1a; 1. 10.0.0.51 2. 10.0.0.% 3. % 4. 10.0.0.0/255.255.255.0 5. Db01 6…...

CSS快速入门

文章目录一、CSS是什么&#xff1f;语法规范引入方式二、CSS选择器标签选择器类选择器ID选择器通配符选择器后代选择器子选择器并集选择器伪类选择器三、常见元素属性字体属性文本属性背景属性圆角矩形元素的显示默认块级与行级元素盒子模式去除浏览器默认样式弹性布局一、CSS是…...

emq-docker安装配置

目录 1 docker配置 2 mysql 认证 2.1 添加认证表 2.2 认证文件配置 3 系统topic docker安装&#xff1b;mysql客户端认证&#xff1b;配置系统topic 获取客户端上下线消息。文件提到配置文件见附件。 1 docker配置 docker镜像地址&#xff1a;emqx/emqx emqx_auth_mysql.…...

Bean三种实例化方式的底层原理

Bean实例化的三种方式 1&#xff0c;使用类构造器实例化&#xff08;无参构造函数&#xff09;2&#xff0c;使用静态工厂方法实例化&#xff08;简单工厂模式&#xff09;3&#xff0c;使用实例工厂方法实例化&#xff08;工厂方法模式&#xff09; 基于以上的三种方式&…...

java25种设计模式之适配器模式

1、定义 适配器模式在java中是一中结构型设计模式。 在实际的java来发中&#xff0c;有时候我们会遇到一些不能直接调用&#xff0c;或者不是客户需要的接口&#xff0c;但是却需要使用时&#xff0c;我们就可以使用适配器设计模式。 适配器设计模式就是将一个原本不兼容的接口…...

【微服务】—— 初识微服务

文章目录1. 什么是微服务1.1 微服务的特性自主专用性1.2 微服务的优势敏捷性灵活扩展轻松部署技术自由可重复使用的代码弹性2. 微服务技术栈3. 微服务架构演进3.1 单体架构3.2 分布式架构服务治理3.3 微服务微服务结构微服务技术对比企业需求1. 什么是微服务 微服务是一种开发软…...

Unity使用webSocket与服务器通信(二)——C#服务器端使用Fleck时的简单服用方法

C#服务端用到Fleck包&#xff0c;它包含哪些可用的回调函数&#xff0c;有哪些常用的api方法&#xff1f; 演示&#xff1a;服务端收到Unity用户发来的信息 1、Fleck服务器提供哪些回调函数 Fleck提供的回调函数有下面几种&#xff1a; //用户连入服务器时... Action OnOp…...

【Linux】线程概念 | 线程控制

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;知识补充&…...

pocsuite3安装及使用

pocsuite3安装及使用简介项目地址环境配置及安装环境要求安装&#xff08;详情可以参考[https://pocsuite.org/](https://pocsuite.org/)&#xff09;使用方法运行模块加载目标参数&#xff1a;Console模式查看有哪些模块使用Telnet 弱密码模块这里以flask模板注入漏洞为例pocs…...

docker从安装到部署一个项目

一.centos安装docker 参考博客&#xff1a;https://blog.csdn.net/m0_47010003/article/details/127775185 1.设置一下下载Docker的镜像源 设置下载的镜像源为国内的阿里云&#xff0c;如果不设置&#xff0c;会默认去Docker的官方下载 yum-config-manager --add-repo http…...

QT编程从入门到精通之十二:“第四章:Qt程序创建基础”之“4.1 创建基础程序”

目录 第四章:Qt程序创建基础 4.1 创建基础程序 4.1.1 新建一个项目...

黑客入门教程【非常详细】从零基础入门到精通,看这一篇就够了!

首先要明白啊&#xff0c;我们现在说的黑客不是那种窃取别人信息、攻击别人系统的黑客&#xff0c;说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心就是渗透攻防技术&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模拟恶意…...

手机怎么远程控制腾讯云云服务器?

手机怎么远程控制腾讯云云服务器&#xff1f;腾讯云提供的连接&#xff1a;Windows系统。可以用远程桌面连接&#xff0c;你本地电脑点击&#xff0c;开始-运行-输入mstsc&#xff0c;弹出的框里&#xff0c;填IP和账号密码信息。 管理服务器上还会运行一个数据采集程序&#…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...