IO进程线程 0829作业

news2024/9/21 2:45:17

作业

1、将消息队列发送接收端实现一遍。

send.c代码

#include <myhead.h>

struct msgbuf {
	long mtype;       /* 消息的类型*/
	char mtext[1000];    /* 消息的正文,长度不是1,可以自定义*/
};

#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'B');//创建key值
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	printf("键:%#x\n",key);//key值
	int msgID = msgget(key,IPC_CREAT|0664);//利用key值创建消息队列的id
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	printf("msgid = %d\n",msgID);//输出消息队列id

	struct msgbuf send;//定义结构体变量
	while(1)
	{
		printf("请输入消息的类型:");
		scanf("%ld",&send.mtype);
		getchar();//吸收enter键
		printf("亲输入消息的内容:");
		fgets(send.mtext,sizeof(send.mtext),stdin);//键盘输入正文
		send.mtext[strlen(send.mtext)-1]  ='\0';
		msgsnd(msgID,&send,leng,0);//leng消息正文大小,不包括类型
		//0:表示阻塞发送
		if(strcmp(send.mtext,"quit")==0)
		{
			break;
		}
	}
	if(msgctl(msgID,IPC_RMID,NULL)==-1)//删除消息队列
	{
		printf("删除队列失败\n");
		return -1;
	}
	return 0;
}

rev.c代码

#include <myhead.h>

struct msgbuf {
	long mtype;       /* 消息的类型*/
	char mtext[1000];    /* 消息的正文,长度不是1,可以自定义*/
};

#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'B');//创建key值
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	printf("键:%#x\n",key);//key值
	int msgID = msgget(key,IPC_CREAT|0664);//利用key值创建消息队列的id
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	printf("msgid = %d\n",msgID);//输出消息队列id

	struct msgbuf rcv;//定义结构体变量
	while(1)
	{

		msgrcv(msgID,&rcv,leng,0,0);//第一个0:读取第一个消息不论类型
		//第二个0,阻塞接收
		printf("%s\n",rcv.mtext);

		if(strcmp(rcv.mtext,"quit")==0)
		{
			break;
		}
	}
	return 0;
}

运行结果:

f80fbc17828d4b7c9ecd5843ff1743a7.png

2、将共享内存发送接收实现一遍。

send.c代码

#include <myhead.h>
#define PAGE_SIZE 4096

int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'W');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);//获取内存段的id
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}
	char *shmADD = shmat(shmID,NULL,0);//获取内存段映射地址
	if(shmADD==(void *)-1)
	{
		perror("shmat");
		return -1;
	}
	char buff[1024];
	while(1)
	{
		printf("请输入共享内存的数据:");
		fgets(buff,sizeof(buff),stdin);//键盘写入buff
		strcpy(shmADD,buff);
		if(strcmp(shmADD,"quit\n")==0)//退出
		{
			break;
		}
	}

	if(shmdt(shmADD)==-1)//取消当前进程共享内存段访问
	{
		perror("shmdt");
		return -1;
	}

	if(shmctl(shmID,IPC_RMID,NULL)==-1)//删除共享内存段
	{
		perror("shmctl");
		return -1;
	}
	return 0;
}

rev.c代码

#include <myhead.h>
#define PAGE_SIZE 4096

int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'W');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);//获取内存段的id
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}
	char *shmADD = shmat(shmID,NULL,0);//获取内存段映射地址
	if(shmADD==(void *)-1)
	{
		perror("shmat");
		return -1;
	}
	while(1)
	{
		printf("%s\n",shmADD);
		if(strcmp(shmADD,"quit\n")==0)
		{
			break;
		}
	}
	if(shmdt(shmADD)==-1)
	{
		perror("shmdt");
		return -1;
	}
	return 0;
}

运行结果:

0a2258be5dc24166bce42ffcdee09847.png

3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。

send.c代码

#include <myhead.h>

struct msgbuf {
	long mtype;       /* 消息的类型*/
	char mtext[1000];    /* 消息的正文,长度不是1,可以自定义*/
};

#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
	pid_t pid = fork();
	if(pid>0)//父进程
	{
		key_t key1 = ftok("./",'B');//创建key值
		if(key1==-1)
		{
			perror("ftok");
			return -1;
		}
		printf("键:%#x\n",key1);//key值
		int msgID1 = msgget(key1,IPC_CREAT|0664);//利用key值创建消息队列的id
		if(msgID1==-1)
		{
			perror("msgget");
			return -1;
		}
		printf("msgid = %d\n",msgID1);//输出消息队列id

		struct msgbuf send;//定义结构体变量
		while(1)
		{
			printf("请输入消息的类型:");
			scanf("%ld",&send.mtype);
			getchar();//吸收enter键
			printf("请输入消息的内容:");
			fgets(send.mtext,sizeof(send.mtext),stdin);//键盘输入正文
			send.mtext[strlen(send.mtext)-1]  ='\0';
			msgsnd(msgID1,&send,leng,0);//leng消息正文大小,不包括类型
			//0:表示阻塞发送
			if(strcmp(send.mtext,"quit")==0)
			{
				break;
			}
		}
		if(msgctl(msgID1,IPC_RMID,NULL)==-1)//删除消息队列
		{
			printf("删除队列失败\n");
			return -1;
		}
		exit(EXIT_SUCCESS);
	}
	else if(pid==0)//子进程
	{
		key_t key2 = ftok("./",'W');//创建key值
		if(key2==-1)
		{
			perror("ftok");
			return -1;
		}
		printf("键:%#x\n",key2);//key值
		int msgID2 = msgget(key2,IPC_CREAT|0664);//利用key值创建消息队列的id
		if(msgID2==-1)
		{
			perror("msgget");
			return -1;
		}
		printf("msgid = %d\n",msgID2);//输出消息队列id

		struct msgbuf rcv;//定义结构体变量
		while(1)
		{
			msgrcv(msgID2,&rcv,leng,0,0);//第一个0:读取第一个消息不论类型
			//第二个0,阻塞接收
			printf("%s\n",rcv.mtext);

			if(strcmp(rcv.mtext,"quit")==0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}
	else{
		perror("fork");
		return -1;
	}
	return 0;
}

rev.c代码

#include <myhead.h>

struct msgbuf {
	long mtype;       /* 消息的类型*/
	char mtext[1000];    /* 消息的正文,长度不是1,可以自定义*/
};

#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
	pid_t pid = fork();
	if(pid>0)//父进程
	{
		key_t key1 = ftok("./",'W');//创建key值
		if(key1==-1)
		{
			perror("ftok");
			return -1;
		}
		printf("键:%#x\n",key1);//key值
		int msgID1 = msgget(key1,IPC_CREAT|0664);//利用key值创建消息队列的id
		if(msgID1==-1)
		{
			perror("msgget");
			return -1;
		}
		printf("msgid = %d\n",msgID1);//输出消息队列id

		struct msgbuf send;//定义结构体变量
		while(1)
		{
			printf("请输入消息的类型:");
			scanf("%ld",&send.mtype);
			getchar();//吸收enter键
			printf("请输入消息的内容:");
			fgets(send.mtext,sizeof(send.mtext),stdin);//键盘输入正文
			send.mtext[strlen(send.mtext)-1]  ='\0';
			msgsnd(msgID1,&send,leng,0);//leng消息正文大小,不包括类型
			//0:表示阻塞发送
			if(strcmp(send.mtext,"quit")==0)
			{
				break;
			}
		}
		if(msgctl(msgID1,IPC_RMID,NULL)==-1)//删除消息队列
		{
			printf("删除队列失败\n");
			return -1;
		}
		exit(EXIT_SUCCESS);
	}
	else if(pid==0)//子进程
	{
		key_t key2 = ftok("./",'B');//创建key值
		if(key2==-1)
		{
			perror("ftok");
			return -1;
		}
		printf("键:%#x\n",key2);//key值
		int msgID2 = msgget(key2,IPC_CREAT|0664);//利用key值创建消息队列的id
		if(msgID2==-1)
		{
			perror("msgget");
			return -1;
		}
		printf("msgid = %d\n",msgID2);//输出消息队列id

		struct msgbuf rcv;//定义结构体变量
		while(1)
		{
			msgrcv(msgID2,&rcv,leng,0,0);//第一个0:读取第一个消息不论类型
			//第二个0,阻塞接收
			printf("%s\n",rcv.mtext);

			if(strcmp(rcv.mtext,"quit")==0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}
	else{
		perror("fork");
		return -1;
	}
	return 0;
}

运行结果:

049e843cb73f444a9f38bb8881ac3756.png

知识梳理

6cd0bf790afc4e68bc73aeb3e7e657fd.png

11d2035fc3bd4aa7844fe86cc0037ee5.png

467681f38f6a4ea6887a24ebae6b0fd4.png

41159bb422614910aa510702375eecdb.png

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+分类模型Python代码源码

前言 简单介绍一下我自己&#xff1a;博主专注建模四年&#xff0c;参与过大大小小数十来次数学建模&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛&#xff0c;三次美赛获得过二次M奖一次H奖&#xff0c;国赛二等奖。**提…

leetcode120. 三角形最小路径和,二维动态规划

leetcode120. 三角形最小路径和 给定一个三角形 triangle &#xff0c;找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说&#xff0c;如果正位于当前…

STM32-PWM驱动舵机——HAL库

什么是舵机&#xff1f; 舵机&#xff0c;也叫伺服电机&#xff0c;在嵌入式开发中&#xff0c;舵机作为一种常见的运动控制组件&#xff0c;具有广泛的应用。 舵机型号介绍&#xff1a; 市面上常见的舵机型号有 SG90、MG90S、MG995、MG996R 等等&#xff0c;主要是扭矩大小…

Linux--IO多路复用(select,poll,epoll)

IO多路复用——select&#xff0c;poll&#xff0c;epoll IO多路复用是一种操作系统技术&#xff0c;旨在提高系统处理多个输入输出操作的性能和资源利用率。与传统的多线程或多进程模型相比&#xff0c;IO多路复用避免了因阻塞IO而导致的资源浪费和低效率问题。它通过将多个IO…

使用matplotlib可视化dataframe:让你的数据更生动有趣

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 1. 简介 在数据分析和可视化领域&#xff0c;matplotlib是一个非常强大的工具。它可以帮助将数据以图形的形式展示出来&#xff0c;使得数据更加直观、易于理解。本文将介绍如何使用matplotlib来可视化pandas中的Da…

小q的数列(c语言)

1./描述 //小q最近迷上了各种好玩的数列&#xff0c;这天&#xff0c;他发现了一个有趣的数列&#xff0c;其递推公式如下&#xff1a; // //f[0] 0 f[1] 1; //f[i] f[i / 2] f[i % 2]; (i > 2) // //现在&#xff0c;他想考考你&#xff0c;问&#xff1a;给你一个n&am…

趣映 v2.3.8 — 高级版,专注动画制作,自媒体变现

趣映是一款专注于为动画垂直账号提供全面视频编辑和制作功能的软件&#xff0c;支持从灵感创作到成片输出的全流程。海量模板助您一键制作爆款动画视频和动漫视频&#xff0c;适配各种场景。此版本已解锁高级功能&#xff0c;提供更丰富的编辑工具和模板。 链接&#xff1a;ht…

MySQL数据库60道面试题 ( 附答案 )

2024的4月招聘季如此卷&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f; 找工作最重要的一步自然是面试&#xff0c;马上跳槽季&#xff0c;网上出现了各种面试题&#xff0c;一时会让人眼花缭乱&…

外排序之⽂件归并排序实现

外排序之⽂件归并排序实现 外排序介绍 外排序&#xff08;External sorting&#xff09;是指能够处理极⼤量数据的排序算法。通常来说&#xff0c;外排序处理的数据不能 ⼀次装⼊内存&#xff0c;只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采⽤的是⼀种“排序-归 …

Spring+SpringWeb+MyBatis三大框架整合教程 实现先前后端交互搭建

目录 1. 创建项目 2. 导入所依赖的 jar 包 3. 配置MyBatis 4. 配置spring事务管理 5. 配置Spring * Spring配置代码解读 6. dao层 7. mappers映射文件 8. common层 9. service层 10. web层 11. 测试 ssm大合体&#xff01; 1. 创建项目 &#x1f4cd;创建一个J…

【C++ Primer Plus习题】6.7

问题: 解答: #include <iostream> #include <cctype> using namespace std;int main() {string words;int vowel 0;int consonant 0;int other0;cout << "请输入一个单词(q结束):";cin >> words;while (words!"q"){if (!isalph…

编成笔记-atan2函数学习分析

分析atan2函数 1. 前言 2. atan2函数分析 tanθy/x : 当(x,y) 在第一象限&#xff0c;0 < θ < π/2当(x,y) 在第二象限&#xff0c;π/2 < θ ≤ π当(x,y) 在第三象限&#xff0c;− π < θ < − π/2当(x,y) 在第四象限&#xff0c;− π/2 < θ <…

动态读取nacos中修改的项目配置文件

本项目用的还是springboot项目&#xff0c;咱们直接上代码 一&#xff1a;首先看下nacos中需要动态获取的属性 二&#xff1a;把需要动态读取的配置类中的属性整理一个实体类 mport lombok.Data; import org.springframework.boot.context.properties.ConfigurationPropert…

微信公众号等工具 3 — 使用 Markdown Nice 写文章

文章目录 操作步骤STEP 1. 进入微信公众号文章编辑界面STEP 2. Markdown Nice 将 3 个重要的功能嵌入到了微信公众号编辑器中STEP 3. 在 Markdown Nice 界面编辑内容STEP 4. 导入/粘贴/直接在编辑器中编辑 Markdown → 点击左下角的预览效果 操作步骤 STEP 1. 进入微信公众号文…

BUUCTF二维码1

九张撕碎二维码碎片。不会让人拼起来吧&#xff01;看了大神们得博客竟然是真的&#xff0c;这是ctf的题吗&#xff01;是考验人的耐性吧&#xff01; 我勉为其难讲一下PS怎么拼图&#xff0c;首先要把九张碎片抠图&#xff0c;背景变透明&#xff0c;ps可以但是太麻烦&#xf…

(亲测有效)spring cloud+Vue微服务项目云服务器部署(宝塔)

我的另一篇博客&#xff0c;有兴趣可以看看&#xff0c;部署思路都是一样的。 &#xff08;亲测有效&#xff09;SpringBootVue项目云服务器部署&#xff08;宝塔&#xff09;_springboot 宝塔部署-CSDN博客 目录 一、准备工作 购买云服务器 登录云服务器 安装宝塔 二、jdk…

项目技巧二

java中Date和mysql数据库datetime数据类型 数据库中的 datetime 类型&#xff1a; 大多数关系型数据库&#xff08;如 MySQL, SQL Server, PostgreSQL 等&#xff09;都提供了 datetime 类型&#xff0c;用于存储日期和时间信息。这些数据库中的 datetime 类型通常遵循 ISO 86…

金九银十跳槽季,最新自动化测试面试题合集

前言 Hello,大家好。金九银十也不远了&#xff0c;有的人盼望升职加薪&#xff0c;有的人立了新的Flag&#xff0c;有跳槽计划的该提上日程了。为解大伙的燃眉之急&#xff0c;今天分享自动化面试题预热一波&#xff0c;欢迎留言区补充评论&#xff01; 一、请描述一下自动化测…

sqli-labs靶场通关攻略(四十一到五十关)

sqli-labs-master靶场第四十一关 一&#xff0c;查看数据库 ?id-1 union select 1,2,database()-- 二&#xff0c;查看表名 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- 三&#xff0c;查看users表中…

python学习之路 - python对mysql的数据操作

目录 一、python对mysql的数据操作1、前期准备2、连接mysql3、创建表5、插入表4、查询表 一、python对mysql的数据操作 1、前期准备 使用python对mysql进行相关操作前&#xff0c;需要安装pymysql。执行pip install pymysql命令即可如果具体不知道如何操作&#xff0c;可以查…