IO作业 day5 6/27

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

#include <myhead.h>

struct Info
{
	const char *srcfile;
	const char *dstfile;
	int start;
	int size;
};

int FileLen(const char *srcfile,const char *dstfile)
{
	//定义文件描述符
	int fd1,fd2;

	//只读打开文件
	if((fd1=open(srcfile,O_RDONLY))==-1)
	{
		perror("file open");
		return -1;
	}

	//只写打开文件
	if((fd2=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("file open");
		return -1;
	}

	//求文件大小
	int len=lseek(fd1,0,SEEK_END);
	//关闭文件
	close(fd1);
	close(fd2);
	return len;
}

/************************定义线程体************************/
void *task(void *arg)
{
	printf("我是子线程\n");
	//创建文件描述符
	int fd1,fd2;
	//只读打开文件
	if((fd1=open(((struct Info *)arg)->srcfile,O_RDONLY))==-1)
	{
		perror("file open");
		return NULL;
	}

	//只写打开文件
	if((fd2=open(((struct Info *)arg)->dstfile,O_WRONLY))==-1)
	{
		perror("file open");
		return NULL ;
	}

	lseek(fd1,((struct Info *)arg)->start,SEEK_SET);
	lseek(fd2,((struct Info *)arg)->start,SEEK_SET);
	int count=0;
	char str[128]="";
	while(1)
	{
		//从源文件读取数据
		int ret=read(fd1,str,sizeof(str));
		count+=ret;//总共读取数据量
		if(ret==0||count>=((struct Info *)arg)->size)
		{
			//超过规定的量,选择性写入
			write(fd2,str,ret-(count-((struct Info *)arg)->size));
			break;
		}
		write(fd2,str,ret);
	}
	close(fd1);
	close(fd2);

}

int main(int argc, const char *argv[])
{
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a.out srcfile dstfile\n");
		return -1;
	}

	//记录文件大小
	int len;
	len=FileLen(argv[1],argv[2]);
	
	//定义结构体数组存放文件拷贝参数
	struct Info s[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,len-len/2}};
	//定义线程号
	pthread_t tid;
	//创建第一个线程
	if(pthread_create(&tid,NULL,task,&s[0]))
	{
		perror("create error");
		return -1;
	}

	//创建第二个线程
	if(pthread_create(&tid,NULL,task,&s[1]))
	{
		perror("create error");
		return -1; 
	}
	
	printf("拷贝完成!\n");
	while(1);
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值