IPC--信号量

进程的IPC操作 之 信号量 一 信号量的定义 信号量的出现,主要是为了解决进程之间对于临界资源的独占式访问。信号量可以满足对于改临界资源的访问只能有一个进程。 二 信号量的操作 LINUX的信号量API都定义在sys/sem.h头文件中: 2.1 信号量的创建 int semget(key_t key, int num_sems, int sem_flags); 函数功能:创建或者获取由键值key标识的信号量集合。 函数参数: key:主要是用于在全局唯一的表示一个信号量集合,相当于全局的文件名一样。 num_se 阅读详情
信号量概念理解
  • 信号量本质上 是一个计数器,用来统计临界资源申请资源的个数。其中的二元信号量的 值是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 消息队列标识符:删除某一个消息队列

Linux 进程通信IPC对象之信号量 什么是信号量信号量与其他IPC对象不同,它是一个计数器,用于多个进程对共享数据对象的访问,它的本质是一种数据操作锁,它不像消息队列和管道那样具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信。如何通过信号量来控制进程间通信为了获得共享资源,进程需要执行下列操作: (1)、测试控制该资源的信号量; (2)、若此信号量为正,则进程可以使用该资源,在这种情况下进程会将信号 阅读详情

相关推荐

IPC信号量 sem

(1)查看所有信号 ipcs -s ------ Semaphore Arrays -------- key        semid      owner      perms      nsems      0x00008708 0          root      666        1          0x000086f8 217120769  root      666

〓☆〓 清风徐来918 (QQ:89617663) 671

IPC之信号量详解

一、信号量介绍 作用:实现进程间的同步和互斥。 信号量,确切地说是信号量集,集合里有≥1个信号量成员。可以把信号量集比作数组,信号量当做数组用的元素。 但是,常用的信号量集都只有一个信号量成员。所以,平常说的信号量一般都指只有1个信号量成员的信号量集。 个人理解:信号量类似标志位。平常的标志位是这样的,初始flag =1. 如果flag=0则去执行某些操作,在程序的某些地方使flag置0。

Qiuoooooo的博客 1717

ipc通信四—信号量

有两个以上的任务(进程/线程)并发的实体,去访问同一个共享资源(硬件上,软件上)的时候,那么要保证访问的这个共享资源是有序访问,如果不是有序访问有可能造成不可预知后果。有两个实例(任务),调用 func 函数,那么 very_important_i 最后的值是多少?有可能是6,还有可能是7。6的结果不是我们想要,所有我们要保证多个实例能够有序的去访问,就需要对共享资源进行某种保护,以便实例可以有序的访问,避免竞争分析: 并发---->竞争---->共享资源的非法访问 ---->程序行为异常…

LXYSDSG的博客 2187

IPC之信号量

1,多个进程或线程有可能同时访问的资源(变量、链表、文件等等)称为共享资源, 也叫临界资源(critical resources)。 2,访问这些资源的代码称为临界代码,这些代码区域称为临界区(critical zone)。 3,程序进入临界区之前必须要对资源进行申请,这个动作被称为 P 操作,P 操作就是申请资源,如果申请成功,资源数将会减少。 4,程序离开临界区之后必须要释放相应的资源,这个动...

weixin_44522306的博客 1067

手把手教你用Python实现最简单的语义通信(Sem Comm)Demo

本文通过Python和PyTorch,手把手教你构建一个基于深度学习的语义通信(Semantic Communication)Demo。该Demo使用自编码器架构,从MNIST图像中提取低维语义特征进行传输与重建,实现了从“传输比特”到“传递含义”的跨越,并探讨了其效率优势与鲁棒性。

weixin_29080843的博客 247

从INCA到Excel:手把手教你移植汽车标定数据的查表插值算法(附源码)

本文详细介绍了如何将汽车标定数据从INCA平台移植到Excel,实现查表插值算法的完整迁移。通过解析INCA MAP数据结构,设计Excel环境下的双线性插值算法,并提供VBA和C#两种实现方案,帮助工程师高效处理标定数据。文章包含实用代码示例和性能优化技巧,适用于ECU开发与标定场景。

weixin_29313239的博客 410

IPC通信--信号量

信号量是一种用于控制多个进程访问共享资源的机制,它工作原理基于一个计数器。信号量的工作原理是测试控制该资源的信号量。如果信号量的值为正,则允许进程使用资源,并将信号量的值减1。如果信号量的值为0,则进程不能立即使用资源,而是进入休眠状态,直到信号量的值变为正数,进程被唤醒后再次尝试使用资源。在进程间通信(IPC)中,信号量通常与其他通信机制一起使用,以确保对共享资源的同步访问。例如,当一个进程正在通过消息队列发送数据时,可以使用信号量来确保在数据写入期间其他进程不会同时读取或修改这些数据。这样可以避免数据的

weixin_41885845的博客 974

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 542

IPC 进程通信:信号量

信号量什么是信号量信号量工作信号量接口函数1.semget函数2.semop函数3.semctl函数信号量操作代码步骤 什么是信号量 它是一个计数器,用 于为多个进程提供对共享数据对象的访问,它是为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题而产生的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。 信号量工作 为了获得共享资源,进程需要执行下列操作。 (1)测试控制该资源的信号量 (2)若此信号量的值为正,则

weixin_48859611的博客 517

深入浅出:CosineLRScheduler 调度器的原理与实战应用

本文深入解析了CosineLRScheduler调度器的核心原理与实战应用,详细介绍了余弦退火算法及其在深度学习模型训练中的优势。通过参数配置建议、PyTorch实现示例和常见问题解决方案,帮助开发者高效应用该调度器提升模型性能,特别适用于计算机视觉和自然语言处理任务。

sss66的博客 859

IMU自动校准论文与代码实现A Robust and Easy to Implement Method for IMU Calibration without External Equipments

PART1 摘要 低成本的惯性测量单元会受到系统误差的影响,系统误差由标度因子和轴偏差造成,这会降低位置和姿态估计的精度。 本文提出了一种无需任何外部设备的,鲁棒性强,易于实现的IMU校准方法。 该程序基于多放置方案,再估计传感器偏差的同时,为加速度和陀螺仪三轴的尺度和偏差系数。我们的方法只需要用手移动传感器,并将其放置在一组不同的静态位置(姿态)。 论文描述了一个鲁棒的快速校准协议,...

qq_29313679的博客 5308

【Linux IPC】之信号量

信号量是IPC通信的一种,它提供了一种机制,主要用于进程间的同步和互斥访问。信号量是一个计数器,用于跟踪资源的可用数量或表示进程间的同步状态。拿电影院售票的例子来举例:每一张电影票都对应一个临界资源,我们想要看电影首先需要买票,但买票的时候我们可能并没有占用那把椅子。**所以这其实是一种对资源的预定机制。**我有多少座位就卖多少张票,保证资源不会被并发访问,也就是同时有两个人买到了同一场的同一张座位。所有的进程想访问资源,必须先申请信号量,信号量也是一种共享资源,因为它需要让所有的进程先看到。

wszhj_的博客 873

PyTorch深度学习实战(36)——Pix2Pix详解与实现

Pix2Pix 是基于生成对抗网络的图像转换框架,能够将输入图像转换为与之对应的输出图像,能够广泛用于图像到图像转换的任务,如风格转换、图像修复、语义标签到图像的转换等。Pix2Pix 的核心思想是通过对抗训练将输入图像和目标输出图像进行配对,使生成网络可以学习到输入图像到输出图像的映射关系。在本节中,将学习使用 Pix2Pix 根据给定轮廓生成图像。

盼小辉丶的博客 1万+

IPC--信号量集

IPC通信机制-信号量集 1.int semget(key_t key,int nsems, int semflg); 第一个参数是由ftok()获取的key , 第二个参数是要创建的信号量的个数,如果是0表示获取信号量集ID 第三个参数是IPC_CREAT,创建信号量集ID。 返回一个信号量集的ID  semid. semid=semget(key,10,IP

天纵神武 6867

提升ARM Cortex-M系统性能的关键技术:TCM技术解析与实战指南

TCM技术为ARM Cortex-M处理器提供了宝贵的确定性性能提升手段,特别适合对时序敏感的实时应用。通过合理配置和优化,工程师可以显著提高系统性能、降低中断响应时间并优化功耗。随着嵌入式系统对实时性要求的不断提高,TCM技术将在工业控制、汽车电子、医疗设备等领域发挥更加重要的作用。未来,ARM处理器可能会进一步扩展TCM容量并优化其与其他内存子系统的协同工作方式,为开发者提供更强大的实时性能保障。

1680

matlab 显示曲面网格【2025最新版】

matlab点云工具箱对点云三维重建结果显示的函数。博客长期更新,本文最近更新时间为:2025年9月14日。

点云侠的博客 2581

IPC机制之信号量及pv操作

关于IPC我们要知道的一些内容 什么是IPC? 答:IPC 全称 Inter-Process Communication,我们可以按照其字面意思来理解,就是指进程间沟通的一种方法。其实我们以前就接触过一些IPC机制,只是当时我们还没有认识到,那就是:管道和信号,这两者都可以达到进程间通信的目的。其实IPC机制还有信号量,共享内存,消息队列,套接字。我们之后会一一介绍,本篇先介绍信号量。 什么...

CheersBilibili的博客 1265

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux IPC 信号量

1. 概念原理 ipc信号原理 2. Semphore.h #ifndef SEMPHORE_H #define SEMPHORE_H #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> ...

chenliang0224的专栏 394

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

System V IPC 之信号量

本文继《System V IPC 之共享内存》之后接着介绍 System V IPC 的信号量编程。在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类。 信号量的分类 在学习 IPC 信号量之前,让我们先来了解一下 Linux 提供两类信号量: 内核信号量,由内核控制路径使用。 用户态进程使用的信号量,这种信号量又分为 POSIX 信号量和 System V 信号量。 POS...

weixin_33862993的博客 2218

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

System V IPC信号量和POSIX信号量详解

定义了ListNode结构体来表示链表的节点,包含一个int类型的数据成员用于存放生产者生产的数据,以及一个指向下一个节点的指针成员。在Linux上,信号量API有两组,一组是System V IPC信号量(信号量),另一组是我们要讨论的POSIX信号量。这两组接口很相似,且语义完全相同,但不保证能互换。进化版的互斥锁(1 --> N)由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。

m0_74795952的博客 949

linux SysV IPC sem信号量实现

信号量值是一个计数器,用于控制多进程对共享资源的访问;进程获取共享资源需要以下步骤: 1.检查资源的信号量值 2.如果信号量值是正,进程可以访问资源;进程将信号量值减1,表示进程已经使用了一个资源 3.如果信号量值是0,进程被阻塞直到信号量值大于0;被阻塞进程被唤醒时重复执行步骤1 注:检查信号量值和减1必须为原子操作   SysV信号量有以下特征: 1.信号量是一个信号量值集合,在

永无止境 3659

Linux下IPC通信:信号量

【代码】Linux下IPC通信:信号量。

weixin_51034082的博客 615

System V IPC信号量和POSIX信号量的区别与联系

在Linux上,信号量API有两组,一组是System V IPC信号量,另一组是POSIX信号量。

m0_74795952的博客 1071

【Linux】System V信号量与IPC资源管理简易讲解

以上内容涵盖了System V信号量的概念、操作函数、优缺点、最佳实践,以及Linux系统中用于管理信号量的IPC指令,同时还深入探讨了操作系统如何统一管理共享内存、消息队列和信号量的机制。

2303_77756141的博客 796

SystemV IPC信号量

semget http://man7.org/linux/man-pages/man2/semget.2.html semctl http://man7.org/linux/man-pages/man2/semctl.2.html semop http://man7.org/linux/man-pages/man2/semop.2.html ftok http://man7.org/...

fish的专栏 413

深入解析SystemV IPC:消息队列与信号量机制

msgget 用来获取信号量,key 可以使用 ftok 进行获取,flag 使用 IPC_CREAT 表示当key所命名的消息队列不存在时创建一个消息队列,如果key所命名的消息队列存在时,IPC_CREAT标志会被忽略,而只返回一个标识符。来存储消息,第二个参数需要传入的即为这个结构体,第三个参数传入的是结构体的大小,最后一个传入标志位,0 即可,其中,如果当前空间不足,msgsnd 就会阻塞,直到有足够的空间,但是如果标志位是 IPC_NOWAIT,则就会直接报错。

2401_84170223的博客 1087
上一篇: IPC--消息队列
下一篇: IPC--共享内存
NeilZhy
博客等级 码龄11年 175粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值