6_27作业 多线程拷贝

该代码实现了一个使用多线程进行分块文件复制的功能。它首先打开源文件,计算其大小,然后创建两个子线程,每个线程负责复制文件的一半内容到目标文件。线程中使用lseek和read/write系统调用来定位和读写文件。
摘要由CSDN通过智能技术生成

1.代码

#include <myhead.h>

struct Info
{
	char *srcfile;
	char *dstfile;
	int start;
	int size;
};
int file_len(const char *srcfile)
{
	int src,dst;
	if((src=open(srcfile,O_RDONLY))==-1)
	{
		perror("open failed");
		return -1;
	}
	
	int len=lseek(src,0,SEEK_END);
	close(src);
//	close(dst);
	return len;
}
void *task(void *arg)
{
	printf("这是子线程\n");
	struct Info info;
	info=*(struct Info *)arg;
	int src;
	int dst;
	
	if((src=open(info.srcfile,O_RDONLY))==-1)
	{
		perror("open failed");
		return NULL;

	}
	if((dst=open(info.dstfile,O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open failed");
		return  NULL;
	}
	lseek(src,info.start,SEEK_SET);
	lseek(dst,info.start,SEEK_SET);
	
	int size=file_len(info.srcfile);
    char buf[30]="";
    int count=0;

	while(1)
	{
		int ret=read(src,buf,sizeof(buf));
		count=count+ret;
		if(ret==0||count>=size)
		{
			write(dst,buf,ret-(count-size));
			break;
		}
		write(dst,buf,ret);
	}
    close(src);
	close(dst);
	


}
int main(int argc, char *argv[])
{
	if(argc!=3)
	{
		printf("input file wrong\n");
		printf("please input the right file\n");
		return -1;
	}
	int len;
	len=file_len(argv[1]);
	pthread_t pid;
    struct Info info[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,len-len/2}};
	if(pthread_create(&pid,NULL,task,&info[0]))
	{
		perror("creat s1 error\n");
		return -1;
	}
	if(pthread_create(&pid,NULL,task,&info[1]))
	{
		perror("creat s2 error\n");
		return -1;

	}
	printf("这是主线程\n");
	
    while(1); 
	
	return 0;
}

2.实现界面
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值