【IO】Day6 线程

 使用多线程实现2个文件的拷贝

#include <myhead.h>

struct Info
{
	const char *src;  //源文件
	const char *dst;  
	int start;  
	int len;  //长度
};


int file_len(const char *srcfile,const char *dstfile)
{
	int fd1,fd2;
 //定义文件描述符以只读形式打开
	if((fd1=open(srcfile,O_RDONLY))==-1)  
	{
		perror("open srcfile error");
		return -1;
	}
	if((fd2=open(dstfile,O_RDWR | O_CREAT | O_TRUNC, 0666))==-1)  
	{
		perror("open dstfile error");
		return -1;
	}
	int len=lseek(fd1,0,SEEK_END);  //定位光标确定拷贝的起始位置
	close(fd1);
	close(fd2);

	return len;
}

//定义子线程线程体
void *task(void *arg) //void *arg 万能指针
{
	//printf("我是子线程\n");
	struct Info *n=(struct Info *)arg;
	int fd1=open(n->src,O_RDONLY); //定义文件描述符以只读形式打开
	int fd2=open(n->dst,O_RDWR); //定义文件描述符以读写形式打开
	if(fd1==-1 || fd2==-1)  
	{
		perror("open error");
		return NULL;
	}

	char buf[128]="";      //定义一个容器存放读取的数据
	int ret;  //记录每次读取的个数
	int count=0;

	//将光标偏移到start处
	lseek(fd1,n->start,SEEK_SET);  //定位光标确定拷贝的起始位置
	lseek(fd2,n->start,SEEK_SET);

	while(1)  //从fd1文件中读取数据存到buf中
	{	
		ret=read(fd1,buf,sizeof(buf));
		count+=ret;
		if(ret==0 || count>=n->len)
		{
			write(fd2,buf,ret-(count-n->len));
			break;
		}
		write(fd2,buf,ret);  //将读取的数据存储到fd2中
	}
	close(fd1);
	close(fd2);

}
int main(int argc, const char *argv[])
{
	//定义一个线程号
	pthread_t tid1,tid2;

	//1.检查文件个数是否为3
	if(argc!=3)
	{
		printf("输入的文件错误\n");
		printf("usage:./a.out srcfile dstfile");
		return -1;
	}
    //2. 获取文件长度
	int len=file_len(argv[1],argv[2]);

	//3.创建线程,使用多线程拷贝
	struct Info s[2]={{argv[1],argv[2],0,len/2},\
					  {argv[1],argv[2],len/2,len-len/2}};
	if(pthread_create(&tid1,NULL,task,&s[0]))
	{
		perror("create error");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task,&s[1]))
	{
		perror("create error");
		return -1;
	}
	printf("拷贝成功\n");
	while(1);  //阻塞不让进程结果
	
	return 0;
}

运行结果如下:

ubuntu@ubuntu:day5$ gcc 12pthread.c  -pthread
ubuntu@ubuntu:day5$ ./a.out 01fork.c  bb.c
拷贝成功
^C  
ubuntu@ubuntu:day5$ diff 01fork.c  bb.c 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值