8.6作业

1.使用创建两个线程,一个线程拷贝文件的前一部分,另一个线程拷贝文件的后一部分

#include <25061head.h>
char filename[128];
char myfile1[128];
char myfile2[128];

void *callback1(void* arg)
{
	int fd_r=open(filename,O_RDONLY);
	if(fd_r<0)
	{
		ERR_MSG("open filename error");
	}
	off_t size=lseek(fd_r,0,SEEK_END);
	if(size==-1)
	{
		close(fd_r);
		ERR_MSG("lseek error");
	}

	umask(0);
	int fd_w1=open(myfile1,O_WRONLY|O_CREAT|O_TRUNC,0644);
	{
		if(fd_w1<0)
		{
			close(fd_r);
			ERR_MSG("open myfile1 error");
		}
	}
	lseek(fd_r,0,SEEK_SET);
	lseek(fd_w1,0,SEEK_SET);
	char buf[4096];
	for(int i=0;i<size/2;i++)
	{
		if(1>read(fd_r,buf,1))
		{
			break;
		}
		write(fd_w1,buf,1);
	}
	printf("前半部分拷贝完成\n");
	close(fd_r);
	close(fd_w1);
	return NULL;

}
void *callback2(void* arg)
{
	int fd_r=open(filename,O_RDONLY);
	if(fd_r<0)
	{
		ERR_MSG("open filename error");
	}
	off_t size=lseek(fd_r,0,SEEK_END);
	if(size==-1)
	{
		close(fd_r);
		ERR_MSG("lseek error");
	}

	umask(0);
	int fd_w2=open(myfile2,O_WRONLY|O_CREAT|O_TRUNC,0644);
	{
		if(fd_w2<0)
		{
			close(fd_r);
			ERR_MSG("open myfile2 error");
		}
	}
	lseek(fd_r,size/2,SEEK_SET);
	lseek(fd_w2,size/2,SEEK_SET);
	char buf[4096];
	for(int i=size/2;i<size;i++)
	{
		if(1>read(fd_r,buf,1))
		{
			break;
		}
		write(fd_w2,buf,1);
	}
	printf("后半部分拷贝完成\n");
	close(fd_r);
	close(fd_w2);
	return NULL;
}

int main(int argc, const char *argv[])
{
	printf("请输入源文件地址:");
	scanf("%s",filename);
	printf("请输入目的文件地址1:");
	scanf("%s",myfile1);
	printf("请输入目的文件地址2:");
	scanf("%s",myfile2);

	pthread_t thread1;
	if(0!=pthread_create(&thread1,NULL,callback1,NULL))
	{
		printf("pthread_create 1 error\n");
		return -1;
	}
	pthread_t thread2;
	if(0!=pthread_create(&thread2,NULL,callback2,NULL))
	{
		printf("pthread_create 2 error\n");
		return -1;
	}
	pthread_join(thread1,NULL);
	pthread_join(thread2,NULL);
	printf("success\n");
	return 0;
}

2.创建两个线程,一个线程实现字符串的逆置,另一个线程打印字符串,并要求打印顺序是

一正一反交替打印

#include <25061head.h>
int i=0;
void *callback1(void* arg)
{
	char arr[]="hello";
	while(1)
	{
		if(i==0)
		{
			sleep(1);
			printf("%s\n",arr);
			i=1;
		}
	}
}
void *callback2(void* arg)
{
	char arr[]="hello";
	int len=strlen(arr);
	char temp;
	for(int i=0;i<len/2;i++)
	{
		temp=arr[i];
		arr[i]=arr[len-1-i];
		arr[len-1-i]=temp;
	}
	while(1)
	{
		if(i==1)
		{
			sleep(1);
			printf("%s\n",arr);
			i=0;
		}
	}
}

int main(int argc, const char *argv[])
{
	pthread_t thread1,thread2;
	if(0!=pthread_create(&thread1,NULL,callback1,NULL))
	{
		printf("pthread_create 1 error");
		return -1;
	}

	if(0!=pthread_create(&thread2,NULL,callback2,NULL))
	{
		printf("pthread_create 2 error");
		return -1;
	}
	pthread_join(thread1,NULL);
	pthread_join(thread2,NULL);

	return 0;
}

3.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值