IOday7作业

1> 使用无名管道完成父子进程间的通信

#include<myhead.h>

int main(int argc, const char *argv[])
{
	//创建存放两个文件描述符的数组
	int fd[2];
	
	int pid = -1;
	//打开无名管道
	if(pipe(fd) == -1)
	{
		perror("pipe");
		return -1;
	}
	
	//创建子进程
	pid = fork();
	if(pid > 0)
	{
		//父进程
		//关闭读端
		close(fd[0]);
		char buf[128]="";
		while(1)
		{
			printf("请输入:");
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1] = 0;
			write(fd[1],buf,strlen(buf));
			if(strcmp(buf,"quit") == 0)
			{
				break;
			}

		}
		close(fd[1]);
	}
	else if(pid == 0)
	{
		//子进程
		close(fd[1]);
		char buf[128]="";
		while(1)
		{
			bzero(buf,sizeof(buf));
			read(fd[0],buf,sizeof(buf));
			printf("输出是:%s\n",buf);
			if(strcmp(buf,"quit") == 0)
			{
				break;
			}

		}
		close(fd[0]);
	}
	else
	{
		perror("fork");
		return -1;
	}
	wait(NULL);

	return 0;
}

 效果图:

2> 使用标准IO完成两个文件的拷贝

#include<myhead.h>

int main(int argc, const char *argv[])
{
	FILE* rfile;
	FILE* wfile;
	if((rfile = fopen("./01test.c","r")) == NULL)
	{
		perror("fopen");
		return -1;
	}
	if((wfile = fopen("./02test.txt","w")) == NULL)
	{
		perror("fopen");
		return -1;
	}
	char buf[128]="";
	int res = 0;
	while(1)
	{
		res = fread(buf,1,sizeof(buf),rfile);
		if(res == 0 || res == -1)
		{
			break;
		}
		fwrite(buf,res,1,wfile);
	}

	fclose(rfile);
	fclose(wfile);
	return 0;
}

 效果图:

3> 使用文件IO实现两个文件的拷贝

#include<myhead.h>

int main(int argc, const char *argv[])
{
	pid_t rpid = -1;
	pid_t wpid = -1;
	if((rpid = open("./01test.c",O_RDONLY))==-1)
	{
		perror("open");
		return -1;
	}
	if((wpid = open("./03test.txt",O_WRONLY | O_CREAT | O_TRUNC,0664))==-1)
	{
		perror("open");
		return -1;
	}
	char buf[128]="";
	int res = 0;
	while(1)
	{
		bzero(buf,sizeof(buf));
		res = read(rpid,buf,sizeof(buf));
		if(res == 0||res == -1)
		{
			break;
		}

		write(wpid,buf,res);
	}
	close(rpid);
	close(wpid);

	return 0;
}

 效果图:

4> 使用多进程完成两个文件的拷贝

#include<myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid = -1;
	int rfd = -1;
	int wfd = -1;
	if((rfd = open("./01test.c",O_RDONLY))==-1)
	{
		perror("open");
		return -1;
	}
	if((wfd = open("./04test.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open");
		return -1;
	}

	int len = lseek(rfd,0,SEEK_END);
	pid = fork();

	if(pid > 0)
	{	
		lseek(rfd,0,SEEK_SET);
		lseek(wfd,0,SEEK_SET);
		char buf[128]="";
		int res = -1;
		int num = 0;
		while(1)
		{	

			res = read(rfd,buf,sizeof(buf));
			num += res;
			if(num > len/2||res == 0)
			{
				write(wfd,buf,res-(num-len/2));
				break;
			}
			write(wfd,buf,res);
		}
		close(rfd);
		close(wfd);
		wait(NULL);
	}
	else if(pid == 0)
	{
		lseek(rfd,len/2,SEEK_SET);
		lseek(wfd,len/2,SEEK_SET);
		char buf[128]="";
		int res = -1;
		int num = 0;
		while(1)
		{	
			
			res = read(rfd,buf,sizeof(buf));
			num += res;
			if(num > (len-len/2) || res == 0)
			{
				write(wfd,buf,res-(num-len/2));
				break;
			}
			write(wfd,buf,res);
		}
		close(rfd);
		close(wfd);
		exit(EXIT_SUCCESS);

	}
	else
	{
		perror("fork");
		return -1;
	}

	return 0;
}

 效果图:

5> 使用多线程完成两个文件的拷贝

#include<myhead.h>
typedef struct
{
	const char* srcfile;
	const char* destfile;
	int place;
	int offset;
}arg;


void* read_file(void* aarg)
{
	arg ofile=*((arg*)aarg);
	printf(" %s %s %d %d\n",ofile.srcfile,ofile.destfile,ofile.place,ofile.offset);
	int  rfd = -1;
	int  wfd = -1;
	if((rfd = open(ofile.srcfile,O_RDONLY))==-1)
	{
		perror("open");
		pthread_exit(NULL);
	}
	if((wfd = open(ofile.destfile,O_WRONLY|O_CREAT,0664))==-1)
	{
		perror("open");
		pthread_exit(NULL);
	}
	lseek(rfd,ofile.place,SEEK_SET);
	lseek(wfd,ofile.place,SEEK_SET);

	char buf[128]="";
	int res = 0;
	int num = 0;
	while(1)
	{
		bzero(buf,sizeof(buf));
		res = read(rfd,buf,sizeof(buf));
		num += res;
		if(num >= ofile.offset||res == 0)
		{
			write(wfd,buf,res-(num-ofile.offset));
			break;
		}
		write(wfd,buf,res);

	}		
	close(rfd);
	close(wfd);
	pthread_exit(NULL);

}


int main(int argc, const char *argv[])
{
	pthread_t rtid = -1;
	pthread_t wtid = -1;
	pid_t fd = -1;
	if((fd = open(argv[1],O_RDONLY))==-1)
	{
		perror("open");
		return -1;
	}
	int len = lseek(fd,0,SEEK_END);
	close(fd);


	arg ofile_information={argv[1],argv[2],0,len/2};
	if((pthread_create(&rtid,NULL,read_file,&ofile_information)) != 0)
	{
		perror("pthread_creat");
		return -1;
	}


	arg tfile_information={argv[1],argv[2],len/2,len-(len/2)};
	if((pthread_create(&wtid,NULL,read_file,&tfile_information)) != 0)
	{
		perror("pthread_creat");
		return -1;
	}
	pthread_join(rtid,NULL);
	pthread_join(wtid,NULL);

	return 0;
}

 

效果图:

6> 将互斥锁的案例重新写一遍

#include<myhead.h>

pthread_mutex_t mutex;
int money = 5000;

void* cost(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);
		money -= 50; 
		printf("小王花了50,还剩%d\n",money);
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	//初始化
	pthread_mutex_init(&mutex,NULL);

	if(pthread_create(&tid,NULL,cost,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	//上锁
	while(1)
	{
		sleep(1);
		pthread_mutex_lock(&mutex);
		money -= 100;
		printf("小张花了100,还剩:%d\n",money);
		pthread_mutex_unlock(&mutex);
	}

	pthread_mutex_destroy(&mutex);

	pthread_join(tid,NULL);
	return 0;
}

 效果图:

7> 将无名信号量实现生产者消费者程序重新实现一遍

#include<myhead.h>

sem_t sem;

void* task1(void* arg)
{
	while(1)
	{
		
		printf("我生产了\n");
		sem_post(&sem);
		sleep(1);
	}
	pthread_exit(NULL);
}

void* task2(void* arg)
{
	while(1)
	{
		sem_wait(&sem);
		printf("我消费了\n");
		//sem_post(&sem);
		sleep(1);
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	pthread_t tid1;
	pthread_t tid2;
	//初始化
	sem_init(&sem,0,0);

	if(pthread_create(&tid1,NULL,task1,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}


	sem_destroy(&sem);

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);


	


	return 0;
}

效果图:

8> 将条件变量实现生产者消费者程序重新实现一遍

#include<myhead.h>

pthread_cond_t cond;
pthread_mutex_t mutex;

void* task1(void* arg)
{
	while(1)
	{
		printf("生产了一个\n");
		pthread_cond_signal(&cond);
		sleep(1);
	}
}

void* task2(void* arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);

		pthread_cond_wait(&cond,&mutex);
		printf("%#lx消费了一个\n",pthread_self());

		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}



int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2,tid3,tid4,tid5,tid6;
	//初始化
	pthread_cond_init(&cond,NULL);
	pthread_mutex_init(&mutex,NULL);
	
	//生产线
	if(pthread_create(&tid1,NULL,task1,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	//消费线
	if(pthread_create(&tid2,NULL,task2,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task2,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid4,NULL,task2,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid5,NULL,task2,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid6,NULL,task2,NULL) != 0)
	{
		perror("pthread_create");
		return -1;
	}

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	pthread_join(tid4,NULL);
	pthread_join(tid5,NULL);
	pthread_join(tid6,NULL);

	pthread_cond_destroy(&cond);

	pthread_mutex_destroy(&mutex);

	return 0;
}

效果图:

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

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

相关文章

Linux信息收集

Linux信息收集 本机基本信息 #管理员 $普通用户 之前表示登录的用户名称&#xff0c;之后表示主机名&#xff0c;再之后表示当前所在目录 / 表示根目录 ~表示当前用户家目录1、内核&#xff0c;操作系统和设备信息 uname -a 打印所有可用的系统信息 uname -r 内核版本 u…

scala安装使用教程_一篇搞定!

1、Scala高级语言 1.1 Scala简介 Scala是一门多范式&#xff08;multi-paradigm&#xff09;的编程语言&#xff0c;设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala运行在Java虚拟机上&#xff0c;并兼容现有的Java程序。 Scala源代码被编译成Java字节码&#…

解读Stable Video Diffusion:详细解读视频生成任务中的数据清理技术

Diffusion Models视频生成-博客汇总 前言:Stable Video Diffusion已经开源一周多了,技术报告《Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets》对数据清洗的部分描述非常详细,虽然没有开源源代码,但是博主正在尝试复现其中的操作。这篇…

DSP处理器及其体系结构特点(您都用过哪些DSP?)

DSP处理器概述 数字信号处理器&#xff08;Digital Signal Processor&#xff0c;DSP&#xff09;是一种专门设计用于执行数字信号处理任务的微处理器类型。与通用微处理器&#xff08;如CPU&#xff09;相比&#xff0c;DSP处理器在处理数字信号时具有更高的性能和效率。 用途…

做抖店代发,新手如何定类目?五大类目优缺点分析!

我是电商珠珠 类目是店铺的方向&#xff0c;只有将店铺的定位确定好&#xff0c;才能超越大部分的同行。 我经常跟我的学生讲&#xff0c;选择类目的时候不能瞎选&#xff0c;要学会去分析市场&#xff0c;由于大部分的学员前期都是新手小白&#xff0c;所以我们这边会负责给…

二维数组附近遍历所有值

二维数组附近遍历所有值 假如以56点为中心&#xff0c;上下左右近距离遍历附近值&#xff0c;看代码&#xff0c;代码把思路写出来了&#xff0c;边界问题暂不处理。 #include<iostream> using namespace std;void FindNearPos(int (*int_arr)[10] , int p_row , int …

解决nuxt使用api代理报错: debug_1$6.Debug.extend is not a function

现象&#xff1a; 这个是使用了nuxt-proxy报的错&#xff0c;但是仅在生产环境才会报错&#xff0c;开发环境没有这个问题。 具体详情可见下面的github issues. nuxt proxy issue 解决办法&#xff1a; 改用代理中间件&#xff1a;nuxt-proxy-request 使用这个中间件的原因…

【工程实践】使用modelscope下载大模型文件

前言 Modelscope&#xff08;魔搭社区&#xff09;是阿里达摩院的一款开源模型平台&#xff0c;里面提供了很多的热门模型供使用体验&#xff0c;其中的模型文件可以通过git clone 快速下载。并且为模型提供了Notebook的快速开发体验&#xff0c;使用阿里云服务&#xff0c;不需…

uView框架的安装与Git管理

参考链接&#xff1a;Http请求 | uView - 多平台快速开发的UI框架 - uni-app UI框架 安装 打开我们项目的cmd进行下载&#xff1a; yarn add uview-ui 首先我们要确定&#xff0c;未下载前的文件目录以及下载后&#xff0c;是多了个文件目录node_modules 下载完成之后我们就…

Android之Binder原理剖析

一&#xff1a;Binder的全面介绍 binder的出现 George Hoffman当时任Be公司的工程师&#xff0c;他启动了一个名为OpenBinder 的项目&#xff0c;在Be公司被ParmSource公司收购后&#xff0c; OpenBinder 由Dinnie Hackborn继续开发&#xff0c;后来成为管理ParmOS6 Cobalt O…

GAN:WGAN-DIV

论文&#xff1a;https://arxiv.org/pdf/1712.01026.pdf 代码&#xff1a; 发表&#xff1a;2018 摘要 在计算机视觉的许多领域中&#xff0c;生成对抗性网络已经取得了巨大的成功&#xff0c;其中WGANs系列被认为是最先进的&#xff0c;主要是由于其理论贡献和竞争的定性表…

免费网页抓取工具大全【附下载和工具使用教程】

在当今信息爆炸的时代&#xff0c;获取准确而丰富的数据对于企业决策和个人研究至关重要。而网页抓取工具作为一种高效获取互联网数据的方式&#xff0c;正逐渐成为大家解决数据需求的得力助手。本文将深入探讨网页抓取工具的种类&#xff0c;并为大家提供简单实用的页面采集教…

FL Studio2024永久免费体验版下载

FL Studio中文绿色21版是一款无需要安装的汉化版本&#xff0c;它是一款非常专业的音频编辑软件&#xff0c;可以让你的音乐突破想象力的限制哦&#xff0c;FL Studio21中文版可以制作出不同音律的节奏&#xff0c;FL Studio内置众多电子合成音色&#xff0c;只Styrus可以让人激…

低多边形游戏风格3D模型纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

5G+AI开花结果,助力智慧安检落地

“请带包的乘客过机安检&#xff01;”&#xff0c;深圳地铁、腾讯共同打造的5GAI智慧安检辅助系统亮相福田枢纽站&#xff0c;进一步解放了人力&#xff0c;提高安检效率&#xff0c;为交通安全保驾护航&#xff0c;让智慧出行成为现实。 传统的安检设备均为人工肉眼辨识&…

【Altera】Quartus II 软件怎么更改bank电压

前言 FPGA的bank电压要和物理设计相同&#xff0c;Quartus II 软件怎么更改bank电压&#xff1f; 步骤 启动 Pin Planner&#xff08;快捷方式&#xff1a;CTRL Shift N&#xff09;右键单击 Pin Planner 的背景&#xff0c;然后选择"显示 I/O bank"。右键…

小知识点——Servlet

Servlet 是什么&#xff1f; Java Servlet 是运行在 Web 服务器或应用服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#xff0c;您可以收集来自网页表单的用户输入&#xff0c;呈…

对python自动生成接口测试的示例讲解

在python中Template可以将字符串的格式固定下来&#xff0c;重复利用。 同一套测试框架为了可以复用&#xff0c;所以我们可以将用例部分做参数化&#xff0c;然后运用到各个项目中。 代码如下&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2…

WordPress限制搜索关键词实现搜索黑名单

昨天有位站长问我能不能限制WordPress的搜索关键词&#xff0c;因为有人利用他的网站搜索色情词汇&#xff0c;本来正常搜索没有影响的&#xff0c;但是在部分网站中&#xff0c;搜索关键词产生的搜索页会被搜索引擎收录&#xff0c;实现推广功能。 WordPress的关键词搜索限制实…

谈谈对OOA、OOD、OOP理解

1 前言 按照开发阶段排序&#xff0c;有如下排序&#xff1a; OOA阶段&#xff1a;面向对象分析&#xff0c;此阶段领域建模&#xff0c;需求分析。OOD阶段&#xff1a;面向对象设计&#xff0c;此阶段输出系统概要设计、系统详细设计。OOP阶段&#xff1a;面向对象编程&#…