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

信号灯集以及 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 信号灯集的概念 信号灯集是进程间同步的一种方式。 信号灯集创建后&#xff0c;在信号灯集内部会有很多个信号灯。 每个信号灯都可以理解为是一个信号量。 信号灯的编号是从0开始的。 比如A进程监视0号灯&#xff0c;B进程监视1号灯。 0号灯有资源&…...

在 Flutter app 中,通过视频 URL 下载视频到手机相册

在 Flutter app 中&#xff0c;通过视频 URL 下载视频到手机相册可以通过以下步骤实现&#xff1a; 1. 添加依赖 使用 dio 下载文件&#xff0c;结合 path_provider 获取临时存储路径&#xff0c;以及 gallery_saver 将文件保存到相册。 在 pubspec.yaml 中添加以下依赖&…...

Nature Methods | 人工智能在生物与医学研究中的应用

Nature Methods | 人工智能在生物与医学研究中的应用 生物研究中的深度学习 随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;尤其是深度学习和大规模预训练模型的出现&#xff0c;AI在生物学研究中的应用正在经历一场革命。从基因组学、单细胞组学到癌症生…...

Axure PR 9 随机函数 设计交互

​大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将深入探讨Axure中随机函数的用法。 随机函数 创建随机函数所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个矩形元件。 3.选中矩形元件&#xff0c;样式窗格中&#xff0c;将…...

【人工智能基础05】决策树模型

文章目录 一. 基础内容1. 决策树基本原理1.1. 定义1.2. 表示成条件概率 2. 决策树的训练算法2.1. 划分选择的算法信息增益&#xff08;ID3 算法&#xff09;信息增益比&#xff08;C4.5 算法&#xff09;基尼指数&#xff08;CART 算法&#xff09;举例说明&#xff1a;计算各个…...

【人工智能基础03】机器学习(练习题)

文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数&#xff0c;判断一个损失函数的好坏无监督分类&#xff1a;kmeans无监督分类&#xff0c;Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…...

HarmonyOS(60)性能优化之状态管理最佳实践

状态管理最佳实践 1、避免在循环中访问状态变量1.1 反例1.2 正例 2、避免不必要的状态变量的使用3、建议使用临时变量替换状态变量3.1 反例3.2 正例 4、参考资料 1、避免在循环中访问状态变量 在应用开发中&#xff0c;应避免在循环逻辑中频繁读取状态变量&#xff0c;而是应该…...

数据库课程设计报告 超市会员管理系统

一、系统简介 1.1设计背景 受到科学技术的推动&#xff0c;全球计算机的软硬件技术迅速发展&#xff0c;以计算机为基础支撑的信息化如今已成为现代企业的一个重要标志与衡量企业综合实力的重要标准&#xff0c;并且正在悄无声息的影响与改变着国内外广泛的中小型企业的运营模…...

C++算法练习-day54——39.组合总和

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 题目&#xff1a;给定一个整数数组 candidates 和一个目标数 target&#xff0c;找出所有独特的组合&#xff0c;这些组合中的数字之和等于 target。每个数字在每个组合中只能使用一次。 思路&a…...

计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Linux的文件系统

这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点&#xff1a;多级索引…...

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接&#xff1a; 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&…...

9)语法分析:半倒装和全倒装

在英语中&#xff0c;倒装是一种特殊的句子结构&#xff0c;其中主语和谓语&#xff08;或助动词&#xff09;的位置被颠倒。倒装分为部分倒装和全倒装两种类型&#xff0c;它们的主要区别在于倒装的程度和使用的场合。 1. 部分倒装 (Partial Inversion) 部分倒装是指将助动词…...

Scala关于成绩的常规操作

score.txt中的数据&#xff1a; 姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;8…...

使用Java实现度分秒坐标转十进制度的实践

目录 前言 一、度分秒的使用场景 1、表示方法 2、两者的转换方法 3、区别及使用场景 二、Java代码转换的实现 1、确定计算值的符号 2、数值的清洗 3、度分秒转换 4、转换实例 三、总结 前言 在地理信息系统&#xff08;GIS&#xff09;、导航、测绘等领域&#xff0c…...

根据后台数据结构,构建搜索目录树

效果图&#xff1a; 数据源 const data [{"categoryidf": "761525000288210944","categoryids": "766314364226637824","menunamef": "经济运行","menunames": "经济运行总览","tempn…...

食品计算—FoodSAM: Any Food Segmentation

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

2411rust,1.83

原文 1.83.0稳定版 新的常能力 此版本包括几个说明在常环境中运行代码可干的活的大型扩展.这是指编译器在编译时必须计算的所有代码:常和静项的初值,数组长度,枚举判定值,常模板参数及可从(constfn)此类环境调用的函数. 引用静.当前,除了静项的初化器式外,禁止常环境引用静…...

tomcat加载三方包顺序

共享库 tomcat支持多个webapp共享一个三方库&#xff0c;而不需要每个webapp都引入该三方库 tomcat加载类顺序 bootstrap&#xff1a;加载jvm提供的类system&#xff1a;加载$CATALINA_HOME/bin下的bootstrap.jar,commons-daemon.jar,tomcat-juli.jar三个包//加载$CLASSPATH…...

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶&#xff08;Horner&#xff09;多项式的错误计算。 例1. 用秦九韶&#xff08;Horner&#xff09;算法计算&#xff08;一百零七&#xff09;例1中多项式 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 给出的仍然是错误结果&#xff0c;因为准…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...