IO进程线程作业day7

信号灯集+共享内存

自定义头文件

#ifndef SEM_H_
#define SEM_H_
//创建信号灯集,
int creat_t(int number);
//申请释放资源
int P(int semid,int semno);
//申请释放资源
int V(int semid,int semno);
//删除信号灯集
int del(int semid);
#endif

信号灯集函数集合

#include <myhead.h>
union semun 
{
	int              val;    /* Value for SETVAL */
	struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
	unsigned short  *array;  /* Array for GETALL, SETALL */
	struct seminfo  *__buf;  /* Buffer for IPC_INFO
								(Linux-specific) */
};
//定义信号灯集中共用体中内容
int creat_light(int semid,int i)
{
	union semun buf;
	printf("请输入要给编号为%d的灯设置的值:", i);
	scanf("%d", &buf.val);
	getchar();
	if(semctl(semid,i,SETVAL,buf) == -1)
	{
		perror("semctl error");
		return -1;
	}

	return 0;
}
int creat_t(int number)
{
	//创建信号灯集的key值
	key_t key=ftok("./",'k');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	//创建信号灯集
	int semid;
	if((semid=semget(key,number,IPC_CREAT|IPC_EXCL|0664))==-1)
	{
		//对错误码进行判断,如果错误码为EEXIST,说明信号灯集已经存在
        if(errno == EEXIST)
        {
            //直接打开信号灯集即可
            semid=semget(key,number,IPC_CREAT|0664);
            return semid;
        }
		perror("semget error");
		return -1;
	}
	//定义信号灯集中灯的编号和每个灯中机构体内容
	for(int i=0;i<number;i++)
	{
		creat_light(semid,i);
	}
			
	return semid;
}
int P(int semid,int semno)
{
	//定义要进行操作的结构体变量
    struct sembuf buf;
    buf.sem_num=semno;
    buf.sem_op=-1;           //表示申请资源
    buf.sem_flg=0;          //表示阻塞方式申请
    //执行函数
    if(semop(semid, &buf, 1) ==-1)
    {
        perror("P error");
        return -1;
    }

    return 0;
}
int V(int semid,int semno)
{
	//定义要进行操作的结构体变量
    struct sembuf buf;
    buf.sem_num=semno;
    buf.sem_op=1;           //表示释放资源
    buf.sem_flg=0;          //表示阻塞方式申请
    //执行函数
    if(semop(semid, &buf, 1) ==-1)
    {
        perror("P error");
        return -1;
    }

    return 0;
}
int del(int semid)
{
	if(semctl(semid,0,IPC_RMID)==-1)
	{
		perror("delete error");
		return -1;
	}
	return 0;
}

发送代码

#include <myhead.h>
#include "sem.h"
#define size 4096
int main(int argc, const char *argv[])
{
	//创建信号灯集
	int semid=creat_t(2);
	//创建共享内存的key值
	key_t key=ftok("./",'k');
		if(key==-1)
		{
			perror("ftok error");
			return -1;
		}
	//创建共享内存空间 
	int shmpid;
	if((shmpid=shmget(key,size,IPC_CREAT|0664))==-1)
	{
		perror("shmget error");
		return -1;
	}
	//映射内存到用户空间
	char *addr=shmat(shmpid,NULL,0);
	if(addr==(void*)-1)
		{
			perror("shmat error");
			return -1;
		}
	while(1)
	{
		//申请0号灯资源
		P(semid,0);
		printf("请输入:");
		fgets(addr,size,stdin);
		addr[strlen(addr)-1]='\0';
		printf("发送成功\n");
		//释放一号灯资源
		V(semid,1);
		if(strcmp(addr,"end")==0)
		{
			break;
		}

	}
	//分离共享内存
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
	}
	return 0;
}

接收代码

#include <myhead.h>
#include "sem.h"
#define size 4096
int main(int argc, const char *argv[])
{
	//创建信号灯集
	int semid=creat_t(2);
	//创建共享内存的key值
	key_t key=ftok("./",'k');
		if(key==-1)
		{
			perror("ftok error");
			return -1;
		}
	//创建共享内存空间 
	int shmpid;
	if((shmpid=shmget(key,size,IPC_CREAT|0664))==-1)
	{
		perror("shmget error");
		return -1;
	}
	//映射内存到用户空间
	char *addr=shmat(shmpid,NULL,0);
	if(addr==(void*)-1)
		{
			perror("shmat error");
			return -1;
		}
	while(1)
	{
		P(semid,1);//申请1号灯资源
		sleep(1);
		printf("收到的数据为:%s\n",addr);
		V(semid,0);//释放0号灯资源
		if(strcmp(addr,"end")==0)
		{
			break;
		}

	}
	//分离共享内存
	if(shmdt(addr)==-1)
	{
		perror("shmdt error");
	}
	//删出共享内存
	if(shmctl(shmpid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error");
		return -1;
	}
	//删除信号灯集
	del(semid);
	return 0;
}

现象展示: 

 思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/411378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于 ResNet50和 SVM + 决策树的人脸口罩检测

欢迎收看&#xff0c;这篇文章是关于我如何使用 ResNet50作为特征提取器来构建掩码检测&#xff0c;然后使用支持向量机(SVM) 决策树和叠加集成方法作为分类器的一个快速解释。 为了向研究人员致敬&#xff0c;这个应用程序是基于研究论文&#xff0c;题目是“在2019冠状病毒…

分布式应用:kylin 部署 zabbix 监控平台

目录 一、实验 1.环境 2. kylin 修改mysql数据库 3. kylin 部署 zabbix 监控平台 4. kylin 修改 zabbix 配置 5. kylin 修改zabbix web 二、问题 1. zabbix_server 查看版本报错 2.zabbix_server 文件如何去掉注释"#"和空行 3. zabbix图表显示异常 4.zabbi…

前端常见面试题之vue3

文章目录 1. vue3比vue2有哪些优势2. 描述vue3的生命周期3. 如何看待vue3中的Composition API 和 Options API4. 如何理解ref、 toRef、和toRefs?5. vue3升级了哪些功能6. Composition API如何实现代码逻辑的复用&#xff08;hook)7. Vue3如何实现响应式的8.Vue3使用Proxy对象…

2-22 方法、面向对象、类、JVM内存、构造方法

文章目录 方法的重载面向对象类、属性和方法成员变量默认值属性JVM简单内存分析栈空间堆空间 构造方法执行过程构造器注意点 方法的重载 一个类中名称相同&#xff0c;但是参数列表不同的方法 参数列表不同是指&#xff1a; 形参类型形参个数形参顺序 面向对象 field —— …

linux系统---防火墙拓展

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 4.白名单 5.通用匹配 6.示例 6.1添加回环网卡 6.2可以访问端口 6.3 主…

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式&#xff08;1&#xff09;分而治之&#xff08;2&#xff09;迭代式设计 3、架构设计的输入&#xff08;1&#xff09;概览&#xff08;2&#xff09;功能需求 - WH分析法&#xff08;3&#xff09;质量 - “怎么”分…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 新年新气象&#xff0c;小猫也是踏上了新年新征程&#xff0c;自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后&#xff0c;小猫对整个系统的把控可谓又是上到可一个新的高度。…

Arduino中安装ESP32网络抽风无法下载 暴力解决办法 python

不知道什么仙人设计的arduino连接网络部分&#xff0c;死活下不下来。&#xff08;真的沙口&#xff0c;第一次看到这么抽风的下载口&#xff09; 操作 给爷惹火了我踏马解析json选zip直接全部下下来 把这个大家的开发板管理地址下下来跟后面python放在同一目录下&#xff0c…

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)

基于Springboot的智慧社区居家养老健康管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现&#xff0c;本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…

理解这几个安全漏洞,你也能做安全测试!

如今安全问题显得越来越重要&#xff0c;一个大型的互联网站点&#xff0c;你如果每天查看日志&#xff0c;会发现有很多尝试攻击性的脚本。 如果没有&#xff0c;证明网站影响力还不够大。信息一体化的背后深藏着各类安全隐患&#xff0c;例如由于开发人员的不严谨导致为Web应…

基于24扇区细分的三电平逆变器异步电机直接转矩控制系统学习

导读&#xff1a;本期文章介绍异步电机三电平24扇区的直接转矩控制。三电平逆变器直接转矩控制中&#xff0c;传统的PWM控制方法存在错判区间等问题。本文在借鉴三电平逆变器单一矢量及合成矢量的直接转矩控制研究和两电平12扇区直接转矩控制的基础上&#xff0c;将两电平12扇区…

堆/堆排序(C/C++)

本篇文章将会较为全面的介绍堆的概念以及实现堆两个重要算法&#xff1a;向上调整算法和向下调整算法。接着实现了堆排序。 若想查看对应位置&#xff0c;可直接按照以下目录进行查看&#xff1a; 目录 1.堆的概念及结构 2.堆的实现 2.1 堆的向上调整算法 2.2 堆的向下调整算法…

beego代理前端web的bug

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、beego代理前端web的bug总结 一、beego代理前端web的bug *报错&#xff0c;为web压缩包index.html里面的注释被错误解析&#xff0c;删掉就行 2024/02/22 10:2…

解析Hadoop三大核心组件:HDFS、MapReduce和YARN

目录 HadoopHadoop的优势 Hadoop的组成HDFS架构设计Yarn架构设计MapReduce架构设计 总结 在大数据时代&#xff0c;Hadoop作为一种开源的分布式计算框架&#xff0c;已经成为处理大规模数据的首选工具。它采用了分布式存储和计算的方式&#xff0c;能够高效地处理海量数据。Had…

蛇形矩阵1

题目描述 把数1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;N*N按照“蛇形1”放入N*N的矩形中&#xff0c;输出结果。 下面是N10的蛇形1的图示 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。 输出格式 N行&#xff0c;每行N个整数。 输入/…

docker下gitlab安装配置

一、安装及配置 1.gitlab镜像拉取 docker pull gitlab/gitlab-ce:latest2.运行gitlab镜像 docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always --privilegedtrue -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v …

小家电—简易过零检测电路

趁刚开工时间有空&#xff0c;总结分析下&#xff0c;在工作项目中常用过零检测电路。 图一 图二 图一在项目中较为常用&#xff0c;两个电路都是通过钳位二极管限幅产生过零脉冲信号。 过零信号高电平被钳位在5.7V&#xff0c;低电平为-0.7V 高电平&#xff1a;VCC0.7V 低电…

LeetCode第七题: 整数反转

题目描述 给你一个 32 位的有符号整数 x​ &#xff0c;返回将 x​ 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1]​ &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 …

江大白 | 目标检测YOLOv9算法,重磅开源!(附论文及源码)

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;目标检测YOLOv9算法&#xff0c;重磅开源&#xff01;&#xff08;附论文及源码&#xff09; 以下文章来源于知乎&#xff1a;cvprLab作者&#xff1a;cvp…