Day25

思维导图

在这里插入图片描述

练习

使用多线程拷贝同一份文件,线程1拷贝前一半,线程2拷贝后一半,主线程阻塞等待回收子线程的资源
源代码

#include <myhead.h>

typedef struct 
{
	const char *srcfile;
	const char *destfile;
	int start;
	int length;
}COPY;

int get_len(const char *srcfile, const char *destfile)
{
	//定义两个文件描述符
	int fd_src, fd_dest;

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

	//以读写的形式打开文件
    if((fd_dest = open(destfile, O_RDWR|O_CREAT|O_TRUNC, 0664)) == -1)
    {
        perror("open file");
        return -1;
    }

	//求源文件大小
	int len = lseek(fd_src, 0, SEEK_END);

	//关闭两个文件
	close(fd_src);
	close(fd_dest);
	return len;
}

//定义拷贝函数
int copy_file(const char *srcfile, const char *destfile, int start, int len)
{
	//定义两个文件描述符
	int fd_src, fd_dest;

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

	//以读写的形式打开文件
    if((fd_dest = open(destfile, O_RDWR, 0664)) == -1)
    {
        perror("open file");
        return -1;
    }
	//定义两个文件的光标
	lseek(fd_src, start, SEEK_SET);
	lseek(fd_dest, start, SEEK_SET);

	//拷贝工作  内容搬运工
	char buf[128];
	int ret = 0,bet;
	int count = 0; //记录读取个数
	while(1)
	{
			//从源文件中读取数据
		ret = read(fd_src, buf, sizeof(buf));
		count += ret; //将读取的个数累加
		if(ret == 0 || count > len)
		{
			write(fd_dest, buf, ret-(count-len));
			break;
		}
		//将读取下来的内容写到新文件中去
		 write(fd_dest, buf, ret);
	}
	close(fd_src);
	close(fd_dest);
	return 0;
}
//线程1拷贝前一半文件  线程2拷贝后一半文件
void *task(void *arg)
{
	COPY *argv = (COPY *)arg;
	copy_file(argv->srcfile, argv->destfile, argv->start, argv->length);
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	//对参数个数进行判断
	if(argc != 3)
	{
		printf("file count error\n");
		printf("urage:./a.out srcfile destfile\n");
		return -1;
	}

	int len = get_len(argv[1], argv[2]);
	COPY file1 = {argv[1], argv[2], 0, len/2};
	COPY file2 = {argv[1], argv[2], len/2, len-len/2};
	
	//定义两个线程
	pthread_t tid1,tid2;

	//创建两个线程
	if(pthread_create(&tid1, NULL, task, &file1))
	{
		perror("create tid1");
		return -1;
	}
	
	if(pthread_create(&tid2, NULL, task, &file2))
	{
		perror("create tid2");
		return -1;
	}

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	return 0;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值