信号灯集以及 P V 操作
一、信号灯集
1.1 信号灯集的概念
信号灯集是进程间同步的一种方式。
信号灯集创建后,在信号灯集内部会有很多个信号灯。
每个信号灯都可以理解为是一个信号量。
信号灯的编号是从0开始的。
比如A进程监视0号灯,B进程监视1号灯。
0号灯有资源,相应的A进程就可以去执行共享内存的写操作。
1号灯有资源,相应的B进程就可以去执行共享内存的读操作。

1.2 信号灯集的API接口分析
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h> -- 所需头文件
int semget(key_t key,int nsems,int semflg);
功能:获取/创建信号灯集
参数:key:通过ftok获取的键值nsems:信号灯集中信号灯的数量semflg:IPC_CREAT|0666 创建信号灯集IPC_CREAT|IPC_EXCL|0666 创建信号灯集,信号灯已经存在,会返回错误0:如果信号灯集已经存在,那么直接获取信号灯集
返回值:成功返回信号灯集的id,失败返回-1,置位错误码#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid,int semnum,int cmd, ...);
功能:控制信号灯集的属性
参数:semid:信号灯的标号semnum:第几个灯cmd:IPC_STAT:获取信号灯集的属性 --- 需要使用第四个参数,不关注第二个参数IPC_SET:设置信号灯集的属性 --- 需要使用到第四个参数,忽略第二个参数IPC_RMID:删除信号灯集 --- 不需要第四个参数,忽略第二个参数SETVAL:设置信号灯的数值 --- 需要第四个参数GETVAL:获取信号灯的数值,以返回值的形式返回,不需要使用第四个参数... ...union semun{int val;struct semid_ds *buf;};
返回值 :GETVAL : 成功返回信号灯的数值其他的cmd :成功返回0失败返回-1,置位错误码
ge1:设置/获取信号灯集的属性union semun sems;struct semid_ds buf;sems.buf = &buf;semctl(semid,0,IPC_STAT,sems);//获取buf:修改buf中你需要设置的数值semctl(semid,0,IPC_SET,sems);//设置
eg2:获取某个信号灯的数值int val = semctl(semid,1,GETVAL); //获取1号灯的数值
eg3:设置某个信号灯的数值union semun sems;sems.val = 1;semctl(semid,1,SETVAL,sems); //将第一个信号灯的数值设置为1
eg4:删除信号灯semctl(semif,0,IPC_RMID);#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid,struct sembuf *sops,size_t nsops);
功能:对某些信号灯做操作
参数:semid : 信号灯的编号sops : 对信号灯的操作struct sembuf{unsigned short sem_num; //信号灯的编写short sem_op; //对信号灯的操作-1: 申请资源1: 释放资源short sem_flg; //操作模式0: 阻塞IPC_NOWAIT : 非阻塞};
nsops:要操作的信号灯的数量如果想要操作多个灯,需要定义一个结构体数组,将数组首地址传入第二个参数
返回值:成功返回0,失败返回-1,置位错误码
read.c
read.c#include <my_head.h>
#define SHM_SIZE 4096
union semun{int val;struct semid_ds *buf; };
//设置信号灯集中信号灯的初始值
void sems_init(int semid,int witch,int val){union semun sem = {.val = val,};semctl(semid,witch,SETVAL,sem);
}
//获取资源,V操作
void V(int semid,int witch){struct sembuf buf = {.sem_num = witch,.sem_op = -1,sem_flg = 0,};semop(semid,&buf,1);
}
//释放资源,P操作
void P(int semid,int witch){struct sembuf buf = {.sem_num = witch,.sem_op = 1,.sem_flg = 0,};semop(semid,&buf,1);
}
int main(int argc,const char *argv[]){//获取键值key_t key = ftok("/home/linux",'a');if(-1 == key){PRINT_ERR("ftok error");}//创建/获取信号灯集int semid = semget(key,2,IPC_CREAT|0666);
if(-1 == semid)PRINT_ERR("semget error");sems_init(semid,0,1); //第0个灯的初始值为1sems_init(semid,1,0); //第一个灯的初始值为0//获取/创建共享内存int shmid = shmget(key,SHM_SIZE,IOC_CREAT|0666);if(-1 == shmid)PRINT_ERR("shmget error");//映射共享内存到用户空间,以读写的方式映射出来char *rbuf = NULL;rbuf = shmat(shmid,NULL,0);char buf[128] = {0};while(1){V(semid,1); //对1号灯V操作printf("rbuf = %s\n",rbuf);P(semid,0);} return 0;
}
write.c
#include <my_head.h>
#define SHM_SIZE 4096
union semnu{int val;struct semid_ds *buf;};
//设置信号灯集中信号灯的初始值
void sems_init(int semid,int witch,int val){union semun sem = {.val = val,};semctl(semid,witch,SETVAL,sem);
}
//获取资源,V操作
void V(int semid,int witch){struct sembuf buf = {.sem_num = witch,.sem_op = -1,.sem_flg = 0,};semop(semid,&buf,1);
};
//释放资源,P操作
void P(int semid,int witch){struct sembuf buf = {.sem_num = witch,.sem_op = 1,.sem_flg = 0,};semop(semid,&buf,11);
}int main(int argc,const char *argv[]){//获取键值key_t key = ftok("home/linux",'a');if(-1 == key){PRINT_ERR("ftok error");}//获取/创建共享内存int shmid = shmget(key,SHM_SIZE,IPC_CREAT|0666);if(-1 == shmid){PRINT_ERR("shmget error");}//创建/获取信号灯集int semid = semget(key,2,IPC_CREAT|0666);if(-1 == semid){PRINT_ERR("semget error");//映射共享内存到用户空间,以读写的方式映射出来char *Wbuf = NULL;wbuf = shmat(shmid,NULL,0);char buf[128] = {0};while(1){V(semid,0);fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';//向共享内存写入内容strcpy(wbuf,buf);p(semid,1);}}
return 0;
}
相关文章:
信号灯集以及 P V 操作
一、信号灯集 1.1 信号灯集的概念 信号灯集是进程间同步的一种方式。 信号灯集创建后,在信号灯集内部会有很多个信号灯。 每个信号灯都可以理解为是一个信号量。 信号灯的编号是从0开始的。 比如A进程监视0号灯,B进程监视1号灯。 0号灯有资源&…...
在 Flutter app 中,通过视频 URL 下载视频到手机相册
在 Flutter app 中,通过视频 URL 下载视频到手机相册可以通过以下步骤实现: 1. 添加依赖 使用 dio 下载文件,结合 path_provider 获取临时存储路径,以及 gallery_saver 将文件保存到相册。 在 pubspec.yaml 中添加以下依赖&…...
Nature Methods | 人工智能在生物与医学研究中的应用
Nature Methods | 人工智能在生物与医学研究中的应用 生物研究中的深度学习 随着人工智能(AI)技术的迅速发展,尤其是深度学习和大规模预训练模型的出现,AI在生物学研究中的应用正在经历一场革命。从基因组学、单细胞组学到癌症生…...
Axure PR 9 随机函数 设计交互
大家好,我是大明同学。 这期内容,我们将深入探讨Axure中随机函数的用法。 随机函数 创建随机函数所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个矩形元件。 3.选中矩形元件,样式窗格中,将…...
【人工智能基础05】决策树模型
文章目录 一. 基础内容1. 决策树基本原理1.1. 定义1.2. 表示成条件概率 2. 决策树的训练算法2.1. 划分选择的算法信息增益(ID3 算法)信息增益比(C4.5 算法)基尼指数(CART 算法)举例说明:计算各个…...
【人工智能基础03】机器学习(练习题)
文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数,判断一个损失函数的好坏无监督分类:kmeans无监督分类,Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…...
HarmonyOS(60)性能优化之状态管理最佳实践
状态管理最佳实践 1、避免在循环中访问状态变量1.1 反例1.2 正例 2、避免不必要的状态变量的使用3、建议使用临时变量替换状态变量3.1 反例3.2 正例 4、参考资料 1、避免在循环中访问状态变量 在应用开发中,应避免在循环逻辑中频繁读取状态变量,而是应该…...
数据库课程设计报告 超市会员管理系统
一、系统简介 1.1设计背景 受到科学技术的推动,全球计算机的软硬件技术迅速发展,以计算机为基础支撑的信息化如今已成为现代企业的一个重要标志与衡量企业综合实力的重要标准,并且正在悄无声息的影响与改变着国内外广泛的中小型企业的运营模…...
C++算法练习-day54——39.组合总和
题目来源:. - 力扣(LeetCode) 题目思路分析 题目:给定一个整数数组 candidates 和一个目标数 target,找出所有独特的组合,这些组合中的数字之和等于 target。每个数字在每个组合中只能使用一次。 思路&a…...
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Linux的文件系统
这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点:多级索引…...
【Vue3】从零开始创建一个VUE项目
【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接: 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】&…...
9)语法分析:半倒装和全倒装
在英语中,倒装是一种特殊的句子结构,其中主语和谓语(或助动词)的位置被颠倒。倒装分为部分倒装和全倒装两种类型,它们的主要区别在于倒装的程度和使用的场合。 1. 部分倒装 (Partial Inversion) 部分倒装是指将助动词…...
Scala关于成绩的常规操作
score.txt中的数据: 姓名,语文,数学,英语 张伟,87,92,88 李娜,90,85,95 王强,78,90,82 赵敏,92,8…...
使用Java实现度分秒坐标转十进制度的实践
目录 前言 一、度分秒的使用场景 1、表示方法 2、两者的转换方法 3、区别及使用场景 二、Java代码转换的实现 1、确定计算值的符号 2、数值的清洗 3、度分秒转换 4、转换实例 三、总结 前言 在地理信息系统(GIS)、导航、测绘等领域,…...
根据后台数据结构,构建搜索目录树
效果图: 数据源 const data [{"categoryidf": "761525000288210944","categoryids": "766314364226637824","menunamef": "经济运行","menunames": "经济运行总览","tempn…...
食品计算—FoodSAM: Any Food Segmentation
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
2411rust,1.83
原文 1.83.0稳定版 新的常能力 此版本包括几个说明在常环境中运行代码可干的活的大型扩展.这是指编译器在编译时必须计算的所有代码:常和静项的初值,数组长度,枚举判定值,常模板参数及可从(constfn)此类环境调用的函数. 引用静.当前,除了静项的初化器式外,禁止常环境引用静…...
tomcat加载三方包顺序
共享库 tomcat支持多个webapp共享一个三方库,而不需要每个webapp都引入该三方库 tomcat加载类顺序 bootstrap:加载jvm提供的类system:加载$CATALINA_HOME/bin下的bootstrap.jar,commons-daemon.jar,tomcat-juli.jar三个包//加载$CLASSPATH…...
计算机的错误计算(一百七十一)
摘要 探讨 MATLAB 中秦九韶(Horner)多项式的错误计算。 例1. 用秦九韶(Horner)算法计算(一百零七)例1中多项式 直接贴图吧: 这样,MATLAB 给出的仍然是错误结果,因为准…...
OpenClaw 如何实现任务恢复与失败重试?
网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...
2026.5.12:三台服务器,一台fastapi的websocket服务接口,一台代理fastapi服务的nginx,一台代理上一个nginx,能穿透websocket吗?
三台服务器,一台fastapi的websocket服务接口,一台代理fastapi服务的nginx,一台代理上一个nginx,能穿透websocket吗? 环境: - 三台服务器 1. 一台fastapi中有websocket接口的服务器:43.226.44.50 2. 一台代理上面1里面的fastapi服务的nginx:43.226.44.184 3. 一台代…...
分布式架构实战:全平台矩阵管理系统的技术实现与性能优化
前言在数字化运营进入全域竞争的今天,多平台账号集群管理已成为企业与开发者的核心技术挑战。传统单体架构的矩阵工具普遍存在算力弹性不足、账号关联风险高、跨平台适配复杂、AI 能力割裂等问题,导致 90% 以上的自研矩阵系统最终以失败告终。本文基于生…...
技术生态依赖的实质与破局:从Android到自主可控的实践路径
1. 项目背景与核心议题解析最近在整理行业资料时,翻到一篇2013年的旧文,讨论的是当时中国工信部对国内移动产业过度依赖Android系统的担忧。虽然时过境迁,但文中提到的“技术自主可控”与“全球生态融入”之间的张力,在今天看来依…...
告别按钮!用Qt实现STM32小车的键盘与手柄控制方案(附串口通信源码)
超越按钮控制:Qt框架下STM32小车的键盘与手柄交互方案 在嵌入式开发领域,人机交互体验往往被忽视,而实际上它直接影响着用户的操作效率和舒适度。对于STM32遥控小车这类需要实时操控的项目,传统的按钮点击方式存在明显局限——操作…...
LightGBM参数太多不会调?一份针对分类问题的‘避坑’指南与核心参数详解
LightGBM分类任务调参实战:从参数误区到精准优化 第一次接触LightGBM时,我被它琳琅满目的参数列表吓到了——光是官方文档列出的就有80多个可调参数。记得当时为了预测用户流失率,我直接把XGBoost的代码换成LightGBM,结果AUC反而下…...
喜马拉雅VIP音频下载指南:xmly-downloader-qt5完整解决方案
喜马拉雅VIP音频下载指南:xmly-downloader-qt5完整解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否曾为…...
Next.js功能开关实践:用happykit/flags实现灰度发布与A/B测试
1. 项目概述:为什么我们需要一个功能开关系统?在软件开发,尤其是现代Web应用和微服务架构的迭代过程中,我们经常面临一个经典困境:新功能开发完成后,是直接全量发布给所有用户,还是先小范围灰度…...
JavaScript自动化PPT生成:如何用代码解放你的演示文稿生产力
JavaScript自动化PPT生成:如何用代码解放你的演示文稿生产力 【免费下载链接】PptxGenJS Build PowerPoint presentations with JavaScript. Works with Node, React, web browsers, and more. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS 还在为…...
终极指南:Diem社区治理的创新机制与DAO组织运作全解析
终极指南:Diem社区治理的创新机制与DAO组织运作全解析 【免费下载链接】diem Diem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world. 项目地址: https://gitcode.com/gh_mirrors/di/di…...
