IO进程线程2.21

本文详细介绍了如何使用C++的多线程技术,将一个大文件分为两部分,由两个线程分别进行拷贝,同时在main函数中管理线程创建、执行和资源回收的过程。
摘要由CSDN通过智能技术生成

作业1:使用多线程完成两个文件的拷贝

第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源

#include <myhead.h>
 
typedef struct Info     //定义一个结构体
{
	char *src;
	char *dest;
	int s;
	int l;
}IF_t;

int sizefile(const char *srcfile,const char *destfile)            //求文件大小的函数
{
	int srcfd,destfd;                                    //定义两个文件描述符
	if((srcfd=open(srcfile,O_RDONLY))==-1)               //以只读形式打开源文件
	{
		perror("open error");
		return -1;
	}

	//以只写创建的形式打开目标文件
	if((destfd=open(destfile,O_WRONLY | O_CREAT | O_TRUNC,0664))==-1)
	{
		perror("open error");
		return -1;
	}
	int len=lseek(srcfd,0,SEEK_END);                 //求源文件大小
	close(srcfd);
	close(destfd);
 
	return len;
}

//定义拷贝文件函数
int copy_file(const char *srcfile,const char *destfile,int start,int len)
{
	//定义源文件与目标文件的文件描述符
	int srcfd,destfd;
	if((srcfd=open(srcfile,O_RDONLY))==-1)            //以只读形式打开源文件
	{
		perror("open error");
		return -1;
	}
	if((destfd=open(destfile,O_WRONLY))==-1)           //以只写形式打开目标文件
	{         
		perror("open error");
		return -1;
	}

	lseek(srcfd,start,SEEK_SET);           //移动文件光标
	lseek(destfd,start,SEEK_SET);
 
	//拷贝文件
	char buf[128]="";
	int size=0;                
	int res=0;
	while(1)
	{
		res=read(srcfd,buf,sizeof(buf));
		size += res;                      //size存储每次读取的字符数
		if(size>=len/2 || res==0)
		{
			write(destfd,buf,res-(size-len));
			break;
		}
		write(destfd,buf,res);
	}
	close(srcfd);
	close(destfd);
	return 0;
}
 
//第一个分支线程
void *task1(void *arg)
{
	IF_t buf=*((IF_t *)arg);
	copy_file(buf.src,buf.dest,buf.s,buf.l);
	pthread_exit(NULL);
}

//第二个分支线程
void *task2(void *arg)
{
	IF_t buf=*((IF_t *)arg);
	copy_file(buf.src,buf.dest,buf.s,buf.l);
	pthread_exit(NULL);
}

//主线程
int main(int argc, const char *argv[])
{	
	//要传递给分支进程的数据
	char *srcfilename="./temp.txt";
	char *destfilename="./test.txt";
	int len=sizefile("./temp.txt","test.txt");
 
	//定义结构体数组变量
	IF_t buf[2]={{srcfilename,destfilename,0,len/2},\
				{srcfilename,destfilename,len/2,len-len/2}};
	//定义线程号变量
	pthread_t tid1,tid2;
	//创建两个线程
	if(pthread_create(&tid1,NULL,task1,&buf[0])!=0){
		printf("create tid1 error\n");                 //第一个分支线程拷贝文件前一半部分
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,&buf[1])!=0){
		printf("create tid1 error\n");                 //第二个分支线程拷贝文件后一半部分
		return -1;
	}
 
	//回收分支线程资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	printf("分支线程回收成功\n");
	printf("文件拷贝成功\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值