嵌入式学习-IO进程线程-Day5

嵌入式学习-IO进程线程-Day5

一、思维导图

在这里插入图片描述

在这里插入图片描述

二、作业

1.使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源

#include <myhead.h>
void *task1(void *arg);
void *task2(void *arg);
int get_len(const char *srcfile,const char *dstfile);
int copy_file(const char* srcfile,const char*dstfile,int start,int len);
typedef struct Info
{
	const char* src;
	const char* dest;
	int start;
	int len;
}info_t;
int main(int argc, const char *argv[])
{
	//定义线程
	pthread_t tid1;
	pthread_t tid2;
		
	//判断外部传参
	if(argc!=3)
	{
		printf("input error\n");
		printf("usage: ./a.out inputfile outfile\n");
		return -1;
	}
	//获取长度
	int len=get_len(argv[1],argv[2]); 
	//定义机构体变量
	info_t file[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,(len-len/2)}};
	
	//创建第一个线程
	if(pthread_create(&tid1,NULL,task1,(void*)&file[0])!=0)
	{
		printf("create thread1 error\n");
		return -1;
	}
	//创建第二个线程
	if(pthread_create(&tid2,NULL,task2,(void*)&file[1])!=0)
	{
		printf("create thread2 error\n");
		return -1;
	}
	//主线程回收两个线程
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	return 0;
}
//第一个线程拷贝上半部分
void *task1(void *arg)
{
	info_t f=*(info_t *)arg;  //将传入的数据解析出来
	copy_file(f.src,f.dest,f.start,f.len);
	printf("上半部分拷贝完成\n");
	pthread_exit(NULL);
}
//第二个线程拷贝下半部分
void *task2(void *arg)
{
	info_t f=*(info_t *)arg;
	copy_file(f.src,f.dest,f.start,f.len);
	printf("下半部分拷贝完成\n");
	pthread_exit(NULL);
}
//计算文件长度函数
int get_len(const char *srcfile,const char *dstfile)
{
	int srcfd=-1;
	int dstfd=-1;
	if((srcfd=open(srcfile,O_RDONLY))==-1)
	{
		printf("srcfile open error\n");
		return -1;
	}
	if((dstfd=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		printf("dstfile open error\n");
		return -1;
	}
	int len=lseek(srcfd,0,SEEK_END);
	close(srcfd);
	close(dstfd);

	return len;
}
//拷贝函数
int copy_file(const char* srcfile,const char*dstfile,int start,int len)
{
	int srcfd=-1;int dstfd=-1;
	char buf[10];
	int count=0;
	if((srcfd=open(srcfile,O_RDONLY))==-1)
	{
		perror("srcfile open error");
		return -1;
	}
	if((dstfd=open(dstfile,O_WRONLY))==-1)
	{
		perror("dstfile open error");
		return -1;
	}
	lseek(srcfd,start,SEEK_SET);
	lseek(dstfd,start,SEEK_SET);
	while(1)
	{
		int res=read(srcfd,buf,sizeof(buf));
		write(dstfd,buf,res);
		count+=res;
		if(count>=len || res==0)
			break;
	}
	return 0;
}

运行结果
在这里插入图片描述

2.使用三个线程完成:线程1输出字符’A’,线程2输出字符’B’,线程3输出字符’C’,要求输出结果为:ABCABCABCABCABC…

#include <myhead.h>
//1.创建无名信号量
sem_t sem_a,sem_b,sem_c;
//分支线程1 
void *task1(void* arg)
{
	while(1)
	{
		sem_wait(&sem_c);//申请C的资源
		printf("A");
		sem_post(&sem_a);//释放A的资源
	}
}
//分支线程2
void *task2(void *arg)
{
	while(1)
	{
		sem_wait(&sem_a);//申请A的资源
		printf("B");
		sem_post(&sem_b);//释放B的资源
	}

}
//分支线程3
void *task3(void *arg)
{
	while(1)
	{
		sem_wait(&sem_b);//申请B的资源
		printf("C\n");
		sem_post(&sem_c);//释放C的资源
		sleep(1);

	}

}
int main(int argc, const char *argv[])
{
	//2.初始化无名信号量
	sem_init(&sem_a,0,0);
	sem_init(&sem_b,0,0);
	sem_init(&sem_c,0,1);//初始化c的资源为1

	//创建线程1
	pthread_t tid1;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{	
		printf("pthread1 create error\n");
		return -1;
	}
	
	//创建线程2
	pthread_t tid2;
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{	
		printf("pthread2 create error\n");
		return -1;
	}
	//创建线程3
	pthread_t tid3;
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{	
		printf("pthread3 create error\n");
		return -1;
	}
	
	while(1);
	//主线程回收线程
	//pthread_join(tid1,NULL);
	//pthread_join(tid2,NULL);
	//pthread_join(tid3,NULL);
	
	sem_destroy(&sem_a);
	sem_destroy(&sem_b);
	sem_destroy(&sem_c);

	return 0;
}


运行结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值