2024.8.1

1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源

代码

#include<myhead.h>
//定义结构体,用来传送文件名
struct File
{
	char file1[20];  //用来保存原文件名
	char file2[20];  //用来保存目标文件名
};


//定义计算长度函数,返回源文件的长度
int getlen(char *file1,char *file2)
{
	int sfd = -1;
	if((sfd = open(file1,O_RDONLY))==-1) 	//以只读的形式打开源文件
	{
		perror("open error");
		return -1;
	}
	int dfd = -1;
	if((dfd = open(file2,O_RDONLY))==-1) 	//以只读的形式打开目标文件
	{ 			//如果文件打不开说明目标文件没有创建,则创建目标文件,两个if防止两个线程都创建并且清空了目标文件
		if((dfd = open(file2,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
		{
			perror("open error");	
		}
	}
	int size = lseek(sfd,0,SEEK_END); //计算长度
	close(sfd); //关闭源文件
	close(dfd); //关闭目标文件
	return size;
}


/******************************task1********************************/
//用来执行读取前一半内容任务的线程
void *task1(void *arg)
{
	//获取源文件的长度
	int len = getlen(((struct File*)arg)->file1,((struct File*)arg)->file2);
	int sfd = -1;
	//只读形式打开源文件
	if((sfd = open(((struct File*)arg)->file1,O_RDONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	int dfd = -1;
	//只写形式打开目标文件
	if((dfd = open(((struct File*)arg)->file2,O_WRONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	lseek(sfd,0,SEEK_SET); //将光标定位到源文件开头
	lseek(dfd,0,SEEK_SET); //将光标定位到目标文件开头
	char buf[2] = ""; //定义一个容器用以搬移
	int count = 0;  //计数
	while(count < len/2) //读写源文件前一半内容
	{
		int res = read(sfd,buf,sizeof(buf)-1);
		write(dfd,buf,res);
		count++;
	}
	//关闭文件
	close(sfd);
	close(dfd);
}
/*******************************task2*******************************/
//读取后一半内容任务的线程
void *task2(void *arg)
{
	//获取源文件的长度
	int len = getlen(((struct File*)arg)->file1,((struct File*)arg)->file2);
	int sfd = -1;
	//以只读的形式打开源文件
	if((sfd = open(((struct File*)arg)->file1,O_RDONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	int dfd = -1;
	//以只写形式打开目标文件
	if((dfd = open(((struct File*)arg)->file2,O_WRONLY))==-1)
	{
		perror("open error");
		return NULL;
	}
	//将光标定位到源文件内容一半的位置
	lseek(sfd,len/2,SEEK_SET);
	lseek(dfd,len/2,SEEK_SET);
	char buf[2] = ""; //定义一个容器用以搬移
	int res = 0; //用来存储正确读取到的个数
	while( res = read(sfd,buf,sizeof(buf)-1)!=0)
	{
		write(dfd,buf,res);
	}
	//关闭文件
	close(sfd);
	close(dfd);
}

/****************主程序**************************/
int main(int argc, const char *argv[])
{
	//判断输入有无两个文件
	if(argc!=3)
	{
		printf("input file error\n");
		return -1;
	}
	struct File file; 	//定义一个结构体
	strcpy(file.file1,argv[1]); //把源文件名传入结构体
	strcpy(file.file2,argv[2]); //把目标文件名传入结构体
	pthread_t tid1,tid2; //创建两个线程
	if(pthread_create(&tid1,NULL,task1,&file)!=0)
	{
		printf("tid1创建失败\n");
	}
	if(pthread_create(&tid2,NULL,task2,&file)!=0)
	{
		printf("tid2创建失败\n");
	}
	//回收进程
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	return 0;
}

效果图 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值