当前位置: 首页 > 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;因为准…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...