首页 > 其他分享 >文件IO,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC

文件IO,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC

时间:2024-06-13 20:01:33浏览次数:12  
标签:fd1 ABC int sum 打印 char 线程 fd open

第二个,拷贝图片

#include <myhead.h>
typedef struct
{
	const char *srcfile;
	const char *destfile;
	int len;
 
}info;
 
void *task1(void *arg)
{
	info buf=*((info *)(arg));
	//打开这两个文件,只读的形式
	int fd=-1;
	if((fd=open(buf.srcfile,O_RDONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	
	//打开第二个文件,只写的形式
	int fd1=-1;
	if((fd1=open(buf.destfile,O_WRONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
 
	//将光标移动到起始的位置
	lseek(fd,0,SEEK_SET);
	lseek(fd1,0,SEEK_SET);
 
	int sum=0;
	char c;
	while(1)
	{
		int res=read(fd,&c,1);
		sum+=res;
		if(sum<=(buf.len/2))
		{
			write(fd1,&c,res);
		}
		else
		{
			break;
		}
	}
	close(fd);
	close(fd1);
 
 
	//退出线程1
	pthread_exit(NULL);
	
}
 
void *task2(void *arg)
{
	info buf=*((info *)(arg));
	//打开这两个文件,只读的形式
	int fd=-1;
	if((fd=open(buf.srcfile,O_RDONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	
	//打开第二个文件,只写的形式
	int fd1=-1;
	if((fd1=open(buf.destfile,O_WRONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	//移动光标
	lseek(fd,buf.len/2,SEEK_SET);
	lseek(fd1,buf.len/2,SEEK_SET);
 
	//将另一半进行拷贝
	char c;
	
	while(1)
	{
		int res=read(fd,&buf,1);
		//如果读取到文件末尾,或者读取错误的时候就退出
		if(res==0||res==-1)
		{
			break;
		}
		write(fd1,&buf,res);
	}
	close(fd);
	close(fd1);
 
 
 
	//退出线程2
	pthread_exit(NULL);
 
}
 
int main(int argc, const char *argv[])
{
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a.out srcfile destfile\n");
		return -1;
	}
 
	//计算文件的大小
	int fd=-1;
	if((fd=open(argv[1],O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	int len=lseek(fd,0,SEEK_END);
	close(fd);
 
	//第二个文件
	int fd1=-1;
	if((fd1=open(argv[2],O_CREAT|O_RDWR|O_TRUNC,0664))==-1)
	{
		perror("open error");
		return -1;
	}
	//创建结构体变量并初始化
	info st={argv[1],argv[2],len};
 
	pthread_t tid1,tid2;
	//创建第一个线程
	if(pthread_create(&tid1,NULL,task1,&st)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	//创建第二个线程
	if(pthread_create(&tid2,NULL,task2,&st)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
 
 
	//主线程用来回收另外两个线程
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	return 0;
}

标签:fd1,ABC,int,sum,打印,char,线程,fd,open
From: https://blog.csdn.net/qq_51852604/article/details/139662834

相关文章

  • 多线程与多进程
    1.进程和线程的定义进程线程的定义:进程可以理解为在操作系统中一个运行起来的程序(程序是指令、数据及其组织形式,进程是程序的实体),是操作系统进行资源分配的最小单位。线程是进程中的一个执行流,是操作系统进行系统调度的最小单位,一个进程由一个或多个线程组成。2.多进程和多线程......
  • ABC348E Minimize Sum of Distances 题解
    ABC348EMinimizeSumofDistances题目大意给定一棵共\(n\)个节点的树,第\(i\)个点的权重为\(c_i\)。定义\(f(x)\)表示树上所有点到节点\(x\)的距离乘上权重,即\(f(x)=\sum\limits_{i=1}^n(c_i\timesdis(x,i))\)。求\(\min\limits_{u=1}^nf(u)\)。Solve一眼换根......
  • ABC 321 E Complete Binary Tree
    题意有T次询问,每次询问给出三个参数N,X,K,分别表示,有N个节点的二叉树,询问从X号节点出发走K条边能走到多少个不同的点。思路对于一颗二叉树上的点,我们可以分两种情况,一种是向上走,一种是向下走。对于向下走,我们只需要不停的、分别的遍历当前节点的右儿子(对于二叉树就是序号乘2),直到......
  • ABC 321 F #(subset sum = K) with Add and Erase
    题意有一个箱子,每次可以向里面添加或者拿走一个数,问每次操作过后,任选箱子里的数相加,总和等于k的方案数是多少。思路萌新算是学到新东西了,这其实是个可撤销背包的板题。我们先考虑一个问题:对于普通计数类dp,我们现在禁用某一个数i,我们现在想知道某一个数j有多少种方式表示(即dp......
  • 爬虫 | 多线程、多进程、协程
    进程和线程"""进程中至少有一条线程,线程和进程的开启非常类似,这里就展示线程"""fromthreadingimportThreadfrommultiprocessingimportProcess#第一种开启的方法就是直接defdeffunc(name):foriinrange(100):print(name,i)if__name__=='__ma......
  • 【Android面试八股文】为什么Android中要设计为只能在UI线程中去更新UI?Android中子线
    文章目录一、Android为什么不能在子线程更新UI?二、为什么Android中要设计为只能在UI线程中去更新UI?三、如果不在UI线程中更新UI,可能会出现什么问题呢?四、ViewRootImp是在onActivityCreated方法后面创建的吗?五、为什么一开始在Activity的onCreate方法中创建一个子线程访问......
  • Future集合会等线程池执行完才开始遍历吗?
    先说结论:Future集合并不是等线程池执行完才开始遍历,而是线程池内的线程执行完一条Future集合就立即遍历一条在使用线程池的业务场景下,我们经常需要获取线程执行的返回值,此时我们需要Callable对象当做线程池参数并用List<Future>接收,然后遍历List<Future>获取我们想要的值。但是......
  • 微信小程序毕业设计-打印室预约系统项目开发实战(附源码+演示视频+LW)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • AT_abc335_d [ABC335D] Loong and Takahashi 题解
    题目传送门题目大意:高桥在一个地图的中心,有一条龙从地图的左上角开始,每次只能到达与他相邻的四个点,现给出地图的边长,请你给出一种方案,使得地图上的每个点除高桥所在的地方外,都被龙走过且不重复。解题思路:首先,我们拿到这个题目,想十秒,便会发现,我们按照螺旋矩阵的方式行走,......
  • bash中$'abc'用法
    在shell脚本或命令行中,$'abc'并不是一个标准的字符串表示方法。通常,shell中的字符串可以用单引号('abc')或双引号("abc")来定义。然而,$'...'这种语法在某些shell环境(如bash)中确实存在,并且它用于处理带有转义字符的字符串。这种语法允许你在字符串中使用特定的转义序列,例如\n......