IO进程线程day8

作业

1> 使用三个程序来完成输出 ABCABCABCABCABC

#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	int semid=create_sem(3);
	printf("semid=%d\n",semid);
	if(semid==-1)
	{
		perror("create_sem error");
		return -1;
	}
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok error!\n");
		return -1;	
	}
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
		{
			perror("shmget error!\n");
			return -1;
		}

	char *shmaddress=(char *)shmat(shmid,NULL,0);
	if(shmaddress==(void *)-1)
	{
		perror("shmat error!\n");
		return -1;
	}
	//输出
	while(1)
	{
		P(semid,2);
		*shmaddress='C';
		printf("%c\n",*shmaddress);
		V(semid,0);
		sleep(1);
	}
	if(shmdt(shmaddress)==-1)
	{
		perror("shmdt error!\n");
		return -1;
	}
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error!\n");
		return -1;

	}
	del_sem(semid);
	return 0;
}
#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	int semid=create_sem(3);
	printf("semid=%d\n",semid);
	if(semid==-1)
	{
		perror("create_sem error");
		return -1;
	}
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok error!\n");
		return -1;	
	}
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
		{
			perror("shmget error!\n");
			return -1;
		}

	char *shmaddress=(char *)shmat(shmid,NULL,0);
	if(shmaddress==(void *)-1)
	{
		perror("shmat error!\n");
		return -1;
	}
	//输出
	while(1)
	{
		P(semid,1);
		*shmaddress='B';
		printf("%c\n",*shmaddress);
		V(semid,2);
		sleep(1);
	}
	if(shmdt(shmaddress)==-1)
	{
		perror("shmdt error!\n");
		return -1;
	}
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error!\n");
		return -1;

	}
	del_sem(semid);
	return 0;
}
#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	int semid=create_sem(3);
	printf("semid=%d\n",semid);
	if(semid==-1)
	{
		perror("create_sem error");
		return -1;
	}
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok error!\n");
		return -1;	
	}
	int shmid=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmid==-1)
		{
			perror("shmget error!\n");
			return -1;
		}

	char *shmaddress=(char *)shmat(shmid,NULL,0);
	if(shmaddress==(void *)-1)
	{
		perror("shmat error!\n");
		return -1;
	}
	//输出
	while(1)
	{
		P(semid,0);
		*shmaddress='A';
		printf("%c\n",*shmaddress);
		V(semid,1);
		sleep(3);
	}
	if(shmdt(shmaddress)==-1)
	{
		perror("shmdt error!\n");
		return -1;
	}
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shmctl error!\n");
		return -1;

	}
	del_sem(semid);
	return 0;
}

2> 将共享内存和信号灯集完成两个进程间通信程序重新实现一下

#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	//1.---信号灯集创建并初始化
	int semid=create_sem(2);
	//创建key
	key_t key=ftok("/",'k');
	if(key ==-1)
	{
		perror("ftok error!\n");
		return -1;
	}
	//使用key来创建共享内存段
	int shmid=shmget(key, PAGE_SIZE , IPC_CREAT|0664);
	if(shmid==-1)	
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid %d\n",shmid);
	//映射共享内存段到用户空间
	char *addr=(char *)shmat(shmid,NULL,0);
	if(addr==(void*)-1)
	{
		perror("shmat error");
		return -1;
	}
	//使用共享内存段
	while(1)
	{

		//2.---P操作
		P(semid,1);
		printf("请输入》》》");
		fgets(addr,PAGE_SIZE,stdin);
		addr[strlen(addr)-1]='\0';
		//3.---v操作
		V(semid,0);
		if(strcmp(addr,"quit")==0)
		{
			break;
		}
	}
	//撤销映射
	if(shmdt(addr)==-1)
	{
		perror("shmdt error\n");
		return -1;
	}
	//删除共享内存段
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shctl error\n");
		return -1;
	}

	//4.---信号灯集删除
	del_sem(semid);
	return 0;
}
#include<myhead.h>
#include"sem.h"
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	//1.---信号灯集创建并初始化
	int semid=create_sem(2);
	//创建key
	key_t key=ftok("/",'k');
	if(key ==-1)
	{
		perror("ftok error!\n");
		return -1;
	}
	//使用key来打开共享内存段
	int shmid=shmget(key, PAGE_SIZE , IPC_CREAT|0664);
	if(shmid==-1)	
	{
		perror("shmget error");
		return -1;
	}
	printf("shmid %d\n",shmid);
	//映射共享内存段到用户空间
	char *addr=(char *)shmat(shmid,NULL,0);
	if(addr==(void*)-1)
	{
		perror("shmat error");
		return -1;
	}
	//使用共享内存段-读取
	while(1)
	{
		//2.---P操作
		P(semid,0);
		printf("共享内存段内内容->%s\n",addr);
		//3.---v操作
		V(semid,1);
		if(strcmp(addr,"quit")==0)
		{
			break;
		}
	}
	//撤销映射
	if(shmdt(addr)==-1)
	{
		perror("shmdt error\n");
		return -1;
	}
	//删除共享内存段
	if(shmctl(shmid,IPC_RMID,NULL)==-1)
	{
		perror("shctl error\n");
		return -1;
	}
	//4.---信号灯集删除
	del_sem(semid);
	return 0;
}

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

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

相关文章

WPF-附加属性《十二》

非常重要 依赖属性和附加属性&#xff0c;两者是有关系的&#xff0c;也是有些区别的&#xff0c;很多时候&#xff0c;可能会把两者混淆了。 附加属性&#xff08;Attach Property&#xff09; 顾名思义&#xff0c;就是附加上面的属性&#xff0c;自身是没有的&#xff0c;…

boost graph之基础

结构 属性相关 #mermaid-svg-PZQvKfbwNSnyXO9g {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PZQvKfbwNSnyXO9g .error-icon{fill:#552222;}#mermaid-svg-PZQvKfbwNSnyXO9g .error-text{fill:#552222;stroke:#5522…

21、pytest参数化中标记单独的测试用例

官方实例 # content of test_expectation_xfail import pytestpytest.mark.parametrize("test_input, expected",[("35",8),("24",6),pytest.param("6*9",42,markspytest.mark.xfail)], ) def test_eval(test_input, expected):asser…

2023-12-12 AIGC-AI工具的基本工作原理

摘要: 2023-12-12 AIGC-AI工具的基本工作原理 AI工具的基本工作原理 AI工具的基本工作原理涉及到一系列复杂的技术和算法。这些原理可以根据不同类型的AI工具进行概括&#xff0c;包括机器学习、自然语言处理、图像识别等。以下是一些关键的AI工具及其工作原理的概述&#xff…

类加载机制与反射

类加载机制与反射 一.虚拟机类加载机制 1.虚拟机类加载机制概述 虚拟机把描述类的数据从class文件加载到内存 将类的数据进行校验,转换解析和初始化 形成可以被java虚拟机直接使用的java类型 2.类加载过程 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加…

WEB渗透—PHP反序列化(一)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…

手拉手探索JSONCrack数据可视化

JSON Crack数据可视化工具 官网&#xff1a;https://jsoncrack.com/ 项目地址&#xff1a;https://github.com/AykutSarac/jsoncrack.com SON Crack 是一个很方便的 JSON 数据可视化工具。 该项目不是简单的展示 JSON 数据,而是将其转化为类似思维导图的形式,支持放大/缩小、展…

华为或荣耀手机禁止强制升级鸿蒙系统的终极方法

需要有数据传输的usb线.打开usb调试模式. 进这个链接下载华为ADB一键卸载VS重装软件 按里面的视频说明,输入88 然后回车即可 https://download.csdn.net/download/viqecel/12161462

Course2-Week4-决策树

Course2-Week4-决策树 文章目录 Course2-Week4-决策树1. 决策树的直观理解2. 构建单个决策树2.1 熵和信息增益2.2 构建决策树——二元输入特征2.3 构建决策树——多元输入特征2.4 构建决策树——连续的输入特征2.5 构建回归树——连续的输出结果(选修)2.6 代码实现-递归构建单个…

数据库范式(详细介绍)

目录 第一范式&#xff08;原子性&#xff09; 第二范式&#xff08;主键唯一性&#xff09; 第三范式&#xff08;原子性主键唯一性&#xff09; BC范式(3NFplus) 第一范式&#xff08;原子性&#xff09; 确保每列保证原子性&#xff0c;保证这个属性&#xff08;字段&am…

未来智能座舱中的人机交互

智能车辆人机交互的发展是中国智能车辆企业品牌升级的重要突破点。通过不断整合人与车辆之间的相互作用&#xff0c;未来的智能车辆将能够提供更全面的沉浸式体验&#xff0c;推动新的互动方式和技术的成熟。这些交互技术不仅满足基本的安全需求&#xff0c;还能满足更深层次的…

马赛克,克星,真来了!v2.0

大家好&#xff0c;今天继续聊聊 AI 开源项目 AI 开源项目 1、DemoFusion AI 绘画的潜力还没有充分挖掘出来&#xff0c;仍然还有上升的空间。 DemoFusion 就是这么一个开源项目&#xff0c;继续深挖了 AI 绘画在高分辨率图片生成的效果。 提高分辨率&#xff0c;马赛克&a…

【JUC】二十五、ThreadLocal内存泄漏问题(强软弱虚四种引用)

文章目录 1、引用之强软弱虚2、强引用3、软引用4、弱引用5、虚引用6、ThreadLocal回顾7、ThreadLocal使用弱引用的原因8、清除脏Entry9、最佳实践 不再会被使用的对象或者变量占用的内存不能被回收&#xff0c;就是内存泄露&#xff08;累积可能导致OOM&#xff09;。 1、引用之…

Echarts小问题汇总

文章目录 Echarts小问题汇总1.柱状图第一条柱子遮挡Y轴解决方法2.在大屏渲染后 拖到小屏变模糊3.相邻柱状图中间不要有空隙4.实现echarts图表自适应5.单个柱状图最大宽度 Echarts小问题汇总 记录工作中使用Echarts的遇见的一些小问题&#xff0c;后续会不断进行补充 1.柱状图…

三数之和(LeetCode 15)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;暴力法方法二&#xff1a;排序双指针 5.实现示例参考文献 1.问题描述 给你一个整数数组 nums&#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时…

P1单片机定时器配置及定时器中断——C51(超详细)

目录 1. 简介 1.1 概念解读 1.2 定时器怎么定时 1.什么是晶振 2.什么是时钟周期 3.什么是机器周期 4.加1经过了多少时间 1.3 定时器编程 1.如何算出10ms定时器的初值(TL0 TH0) 2.关于TCON ,怎么知道爆表 3.怎么开始计时(TR0) 4.定时器使用是有很多种模式的&#xf…

Gerrit的使用

项目存储配置 为了能够模拟开发人员和审核人员两个角色&#xff0c;需要有1台服务器模拟操作提交和审核 登陆linux服务器账户&#xff0c;并生成id_rsa.pub 添加git配置 Git配置一般存储的是name 和 email地址 这里的email地址需要和gerrit系统的账号的email地址一致&#…

佛山陶企再造行业新风口,开启中国陶瓷下半场

近年来&#xff0c;消费形态逐渐呈现年轻化、时尚化、数字化的趋势&#xff0c;新一地居住者对于居住环境的品质和舒适度要求日益提高。伴随着新消费势力的崛起&#xff0c;家居建材行业消费转型升级已成必然。“千年陶都”佛山作为我国陶瓷行业的风向标&#xff0c;率先推进技…

SD-WAN组网案例分享——简单高效的远程视频监控方案

在网络化和信息化建设的推动下&#xff0c;远程视频监控设备的应用范围已经不再局限于政府部门和金融行业。中小企业对远程视频监控设备的需求也在持续增长。 案例背景 本次案例分享的是一家大型制造业企业&#xff0c;该企业拥有遍布全国各地的生产厂房和仓库。然而&#xff…