进程间通信---信号量

进程通信——信号量 文章目录浅谈什么是信号量ftok()函数获取IPC关键字信号量的相关函数信号量的使用代码示例 浅谈什么是信号量 在讲信号量之前,先了解两个概念同步和互斥:一条食品生产线上,假设A、B共同完成一个食品的包装任务,A负责将食品放到盒子里,B和C负责将盒子打包。必须得是A先装食品B再打包吧,要是B不按规则先打包,那A还装啥,所以就需要一种机制方法保证A先进行B再进行,“信号量”就是这种机制方法,AB之间... 阅读详情

信号量是一个计数器,用于多进程或者多线程之间的数据同步,最常用的是二进制信号量。

为了获取资源,进程需要进行如下操作:

1 测试控制该资源的信号量

2 若信号量的值为正,表明进程可以使用此资源。进程将信号量的值减1

3 若信号量的值为0,则进程进入休眠状态,直至信号量大于零,进程被唤醒。

 

在linux中,信号量的测试和-1操作是原子性的,在内核中实现。

下面就来介绍XSI信号量的操作,主要用到了三个函数

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

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

3 int semop(int semid,struct sembuf semoparray[], int nops);

下面来逐一介绍:

int  semget(key_t key,int nsems,int flag) 的功能是创建一个信号量的集合。

参数key是信号量的标识,当在一个进程中创建了信号量之后,可以使用这个key在别的进程中打开。

参数 nsems表示信号量集合中包含的信号量的个数。

参数 flags为创建信号量的标志,有IPC_CREAT等,创建的时候,需要制定IPC_CREAT标志。

此函式也可以用来打开一个已经存在的信号量,此时key为此信号量创建时的key,nsems和flag填0即可。

 

int  semctl(int semid,int semnum,int cmd,union semun arg),这个函数用来对信号量进行控制。

参数semid唯一标识系统中已经创建的信号量

参数semnum表示要操作的信号量集合中信号量的序号,序号从0开始,到semnum - 1.

参数cmd表示需要进行的操作命令,共有十个命令,常用的有SETVAL,GETVAL

参数arg的作用视cmd而定,相信的命令情况参考man手册。

 

int semop(int semid,struct sembuf semoparray[], int nops) 可以获取或者释放一个信号量

参数semid是信号量的标识id,主要的参数是semoparray,其类型是:

struct sembuf

{

    unsigned short sem_num;   //要操作的信号量在信号量集合中的序号

    short                sem_op;      //1表示释放信号量,-1表示获取资源

    short                sem_flg;      //IPC_NOWAIT,SEM_UNDO,若设为IPC_NOWAIT当不能获取资源时不阻塞,返回EAGAIN

};

参数nops表示struct sembuf数组中元素的个数

 

光说不练,印象不够深刻,实践是学习编程的最好的方法,下面就通过一个小程序来演示一下信号量的使用,程序分为两部分,一个服务端,一个客户端,服务端创建一个信号量,获取信号量资源,休眠20秒钟后释放信号量。客户端启动时去获取服务端创建的信号量,直到服务端释放后才能获取。

---------------------------------------------------------------------------------------------------------------

semsvr.cpp

-----------------------------------------------------------------------------------------------------------------

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

#include <unistd.h>
#include <iostream>

using namespace std;

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

 

//创建一个信号量集合

int Create_Sem(int key)
{
 int semid = 0;
 if((semid = semget(key,1,IPC_CREAT)) == -1)
 {
  cout << "create sem failed" << endl;
  return -1;
 }
 cout << "create sem success" << endl;
 union semun sem;
 sem.val = 1;
 semctl(semid,0,SETVAL,sem);  //初始化信号量的值为1,表明只允许一个进程拥有这个信号量
 cout << "create compelte" << endl;
 return semid;
}

 

//打开已经存在的信号量

int Open_Sem(int key)
{
 return semget(key,0,0);
}

 

//获取信号量资源

int Lock_Sem(int semid)
{
 struct sembuf buff;
 buff.sem_num = 0;
 buff.sem_op = -1;
 return semop(semid,&buff,1);
}

 

//释放信号量资源

int Release_Sem(int semid)
{
 struct sembuf buff;
 buff.sem_num = 0;
 buff.sem_op = 1;
 return semop(semid,&buff,1);
}

 

//删除信号量

int Delete_Sem(int semid)
{
 return semctl(semid,0,IPC_RMID,0);
}
int main()
{
 int semid = Create_Sem(12345);
 if(semid == -1)
 {
  cout << "create sem failed" << endl;
  return 0;
 }
 if(Lock_Sem(semid) == -1)
 {
  cout << "lock sem failed" << endl;
  return 0;
 }
 cout << "lock sem success" << endl;
 sleep(20);
 Release_Sem(semid);
 cout << "release sem success" << endl;
 return 0;
}
----------------------------------------------------------------------------------------------------------------

semcli.cpp

-----------------------------------------------------------------------------------------------------------------

 

int main()
{
 int semid = Open_Sem(12345);
 if(semid == -1)
 {
  cout << "open sem failed" << endl;
  return 0;
 }
 if(Lock_Sem(semid) == -1)
 {
  cout << "lock sem failed" << endl;
  return 0;
 }
 cout << "lock success" << endl;
 Delete_Sem(semid);
 return 0;
}

 

【Linux】进程间通信之信号量 1、为什么要用信号量        管道和消息队列都是两个或多个进程访问一个共享资源,而为了防止出现因多个线程同时访问一个共享资源而引发的一系列问  题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执 行数据更新的代码需要独占式地执行。而信号量就是提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就 是说信 阅读详情

相关推荐

手把手教你调试RTL8201F:从芯片手册解读到LWIP驱动移植

本文详细解析了RTL8201F PHY芯片的开发流程,从寄存器配置到LWIP驱动移植,重点介绍了RMII模式下的特殊配置要点和调试技巧。通过实战案例和高级调试方法,帮助工程师解决网络性能问题,实现与FreeRTOS+LWIP协议栈的稳定集成。

ik678901234的博客 973

进程间通信(6)——信号量

通过前面几篇博文,大概清楚这些IPC 的设计都是为了进程间数据的共享而设计的,例如,本文将要介绍的信号量(semaphore) 跟这些有些区别,更确切说它是为了共享数据的访问服务,它是一个计数器,是由提出,并通过PV(通过&释放,是荷兰文缩写)操作对信号量进行控制。的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。

私房菜 2587

从“手扫感应灯”拆解开始:聊聊三极管放大电路在生活中的那些实用设计

本文通过拆解手扫感应灯,深入探讨了三极管放大电路在日常生活中的实用设计。从红外信号放大到环境干扰应对,详细解析了电路配置技巧和调试方法,并延伸至声控灯、电容感应等智能家居应用,帮助读者理解并掌握三极管放大电路的核心原理与实践技巧。

weixin_42627853的博客 390

学习笔记——进程间通信之信号量

重点来了!!!我们先看看PV同步和互斥等基本概念。。。进程在运行过程中,一般会与其他的进程共享资源,而有些资源具有排他性。一次只能为一个进程所使用,通常把这种一次仅允许一个进程使用的资源称为临界资源(如:打印机、绘图机、一些进程间共享的变量、缓存区)。进程访问临界资源的那段代码称为临界区,也叫临界段。访问临界资源应遵循如下原则:1、空闲让进(或有空即进):当进程处于临界区时,可以允许一个请求进出临界区的进程立即进出自己的临界区。2、忙则等待(或无空则等):当已有进程进入临界区时,其他试图进入临界区的进程必须

打不倒的程序猿 3100

影刀RPA之成绩批量查询系统

自动化登录账号,读取数据表中内容去填写信息去查询,并判断多个数据不同的页面去不同的读取查询结果内容,如考生各项信息与各科成绩,总分和查询时间,采集出来到指定的数据表格中,等待时间并依次循环运行。主要功能。

2201_75330891的博客 1086

手把手教你用.NET Reactor 7.3.0保护跨平台.NET应用(含macOS/Rider配置)

本文详细介绍了如何使用.NET Reactor 7.3.0为跨平台.NET应用提供代码保护。文章重点涵盖了在macOS环境下的GUI工具安装、与JetBrains Rider的深度集成配置,并针对Avalonia UI框架提供了专项保护策略和避坑指南,帮助开发者有效防止代码被反编译和破解。

coffee的博客 596

进程间通信方式——信号量(Semaphore)

信号量的工作原理,进程通过信号量如何获得共享资源,详解与信号量有关的函数,sembuf的sem_flg标志设为SEM_UNDO的作用以及模拟实现二元信号量。

sky_Mata的博客 2万+

领域驱动设计整理——实体和值对象设计

实体引言在领域驱动设计里,实体的设计可以说是通用语言的核心,也是最开始在模型划分中需要考虑的。怎么样设计实体和怎么样划分限界上下文同样重要。实体的概念就是要保证通用语言的完整性。领域驱动让设计实体的关注点从数据的属性和表的关联转化到了富有行为的领域概念上。 实体是具有可变性的,这是一个和值对象比较明显的区分,也即实体是可以持续得变化,持续得修改,并且具有唯一的标识。在设计实体的时候需要跳出CRUD的

马猴烧酒└(┐卍^o^)卍ドゥルルル~楪詩月「YUZURIHA SHIZUKI」 2万+

进程间通信----信号量

信号量,是一种特殊的变量:只能对信号量执行P操作和V操作P操作(要执行代码的时候): 如果信号量的值 == 0, 则挂起该进程,如果信号量的值 > 0, 则把该信号量减1V操作(执行完代码的时候): 如果有进程因该信号量而被挂起,则恢复该进程运行,如果没有进程因该信号量而挂起,则把该信号量加1注意:P操作、V操作都是原子操作,即其在执行时,不会被中断。注意:此指的“信号量”是指System V IPC的信号量,与线程所使用的信号量不同。该信号量,用于进程间通信。

m0_60529319的博客 1510

黑猫带你学eMMC协议第17篇:超详细的eMMC HS200 & HS400讲解

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 本文大约6000字,主要内容有: 1.什么是emmc hs200/hs400? 2.什么是tuning?tuning的过程又是什么? 3.如何设置才能让emmc进入hs200 mode? 4.如何设置才能让emmc进入hs400 mode? 5.emmc关于HS200/HS400内部结构框图对比。 6.部分个人相关经验总结。

黑猫奥利奥的博客 1万+

YOLOv11改进策略【Conv和Transformer】| IJCAI 2024 利用FreqFormer中的SFA 空间 - 频率注意力和CTA 通道转置注意力 二次改进C3k2

在FreqFormer模型中,SFA(Spatial-Frequency Attention)和CTA(Channel Transposed Attention)模块是关键组成部分,它们针对传统Transformer在图像超分辨率任务中的不足而设计,旨在更好地恢复高频细节,提升模型性能。

Limiiiing的博客 761

进程间通信——信号量

减少信号量的值(P操作),通常为-1。:增加信号量的值(V操作),通常为1。= P操作(申请资源,值减1)= V操作(释放资源,值加1)如果信号量值不够减,默认会阻塞。示例2:获取和修改信号量属性。示例1:创建并初始化信号量。:信号量集中信号量的数量。:等待信号量值变为0。

weixin_45720999的博客 1461

虚幻商城 Quixel 免费资产一键入库

在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。

一碗清深的博客 3359

Linux:进程间通信之信号量

system V的进程间通信除了共享内存,还有消息队列和信号量IPC(进程间通信的简称)

Au_ust的博客 1403

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

进程间通信之Linux信号量编程

信号量 信号量(Semaphore)是一种用于实现计算机资源共享的IPC机制之一,其本质是一个计数器。信号量是在多进程环境下实现资源互斥访问或共享资源访问的方法,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,进程/线程必须获取一个信号量;一旦该关键代码段完成了,那么该进程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个进程释放信号量。 信号量有两种应用形...

程序人生 8360

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

进程间通信:信号量

进程间通信的机制,它们最初由AT&T System V.2版本的UNIX引IPC (Inter-Process Communication,进程间通信)机制,或被更常见的称为System V IPC。正如我们所看到的,它们并不是进程间通信的唯一方法,但人们通常把这些特定的机制称为System V IPC。 信号量 当我们编写的程序使用了线程时,不管它是运行在多用户系统上、多进程系统上,还是运行在多用户多进程系统上,我们通常会发现,程序中存在着一部分临界代码,我们需要确保只有一个进程(或一个执行线程)

weixin_43887148的博客 1973

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

进程间通信(IPC)之信号量

史上最全面剖析进程间通信下的信号量机制,细谈信号量,从基础学起,逐步深入。欢迎各位博友来访,交流学习,共同进步.....

Xiao__Tian__的博客 3275

【进程间通信】Posix 信号量

本文介绍了POSIX信号量的两种类型及其使用方式。有名信号量通过内核维护,使用sem_open()创建/打开,sem_wait()/sem_post()进行P/V操作,sem_close()/sem_unlink()关闭删除。基于内存的信号量通过sem_init()初始化,需配合共享内存实现进程间同步。文中提供了两种信号量的代码示例:有名信号量的生产者-消费者模型演示了基本的同步操作;基于内存的信号量则实现了一个环形队列的生产者-消费者模型。

KuKudeZ的博客 1335

Linux 基于信号量的进程间通信

Linux 基于信号量的进程间通信前言一、常见进程间通信方式的原理二、基于信号量的进程间通信1. 功能2.代码3. 细节总结 前言 进程间通信,故名思意是在不同进程间传递消息,因为每个进程都有自己独立的虚拟地址空间,方式主要有如下几种:管道(有名管道和无名管道),共享内存,内存映射,消息队列, 信号,信号量,套接字等方式 一、常见进程间通信方式的原理 无名管道(PIPE):只能用在具有亲缘关系的进程中比如父子进程,基本原理是使用内核缓冲区作为通信介质,亲缘关系的进程具有缓冲区的读写描述符,一个进程写入

hqm178933的博客 967

进程间通信之信号量

1、进程间通信概述 一般情况下,系统中运行着大量的进程,而每个进程之间并不是相互独立的,有些进程之间经常需要互相传递消息。但是每个进程在系统中都有自己的地址空间,操作系统通过页表和实际物理内存所关联,不允许其他进程随意进入。因此,就必须有一种机制既能保证进程之间的通信,又能保证系统的安全,即进程间通信机制——IPC(Inter_Process Communication)。 Linux中的内存...

煮酒论英雄 458

基于信号量的进程间通信

预期输出: Semaphore 0, value 1 Semaphore 1, value 2 Semaphore 2, value 3 Semaphore 3, value 4 Semaphore 4, value 5 Semaphore 0, value 1 Semaphore 1, value 2 Semaphore 2, value 3 Semaphore 3, value 4 Semaphore 4, value 5。为了完成本关任务,你需要掌握:信号量的相关通信过程。开始你的任务吧,祝你成功!

m0_74148180的博客 701

Linux进程间通信——信号量&信号详解

SIG_DFL 为默认动作,SIG_IGN 为忽略(函数名是函数的入口地址,这里的sighandler_t 是函数指针类型名 通过typedef void(*sighandler_t)(int)实现,因此自定义函数也要设置成无返回值,参数为1个int型的//由于signal在不同类unix系统的行为不完全一样,系统建议使用sigaction函数。

2301_79532069的博客 2805

Linux下的进程间通信——信号量

一、什么是进程间通信 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。 二、信号量在进程间通信方式

pen_pen_的博客 316

进程间通信——POSIX 有名信号量与无名信号量

原文地址:blogof33.com/post/9/ 前言 在 POSIX 系统中,进程间通信是一个很有意思的话题。 POSIX信号量进程是3种 IPC(Inter-Process Communication) 机制之一,3种 IPC 机制源于 POSIX.1 的实时扩展。Single UNIX Specification 将3种机制(消息队列,信号量和共享存储)置于可选部分中。在 SUSv4 之...

weixin_34087301的博客 2233
上一篇: 关于动态创建的表格单元格中的事件
下一篇: 实现一个简单的linux线程池
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值