#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void* copy_tail(void* arg)
{
off_t size = *(int*)arg;//接收被复制文件一半的大小,作为复制下半部分的起始点
//打开被复制的文件
int a = open("./1.jpg",O_RDONLY);
//打开需要复制的文件,因为在创建子线程前就已经创建清空过了,这里千万不要清空,以写的方式打开即可
int b = open("./2.jpg",O_WRONLY);
ssize_t size_len;
char c;
while(1)
{
size_len = read(a,&c,sizeof(c));
write(b,&c,size_len);
//这里只要打印到文件末尾即可结束循环,无需考虑文件大小的奇偶性
if(0==size_len)
{
printf("后半部分打印完成\n");
break;
}
}
close(a);
close(b);
//为了防止主线程比在子线程未结束时就提前结束,造成后半部分打印出错
//这里用pthread_exit(),在主线程用pthread_join()阻塞,等待子线程结束即可
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//打开被复制的文件
int a = open("./1.jpg",O_RDONLY);
//创建
int b = open("./2.jpg",O_WRONLY|O_CREAT|O_TRUNC,0775);
//计算文件大小并且取一半
off_t size = (lseek(a,0,SEEK_END))/2;
//将文件偏移量重新移到开头
lseek(a,0,SEEK_SET);
//创建线程
pthread_t tid ;
if(pthread_create(&tid,NULL,copy_tail,(void*)&size)!=0)
{
fprintf(stderr,"creat pthread on error\n");
close(a);
close(b);
return -1;
}
ssize_t size_len;
char c;
while(1)//复制前半部分
{
size_len = read(a,&c,sizeof(c));
write(b,&c,size_len);
if(lseek(a,0,SEEK_CUR)==size)
{
printf("前半部分打印完成\n");
break;
}
}
close(a);
close(b);
//阻塞,等待子线程结束
pthread_join(tid,NULL);
return 0;
}
用线程完成图片拷贝,要求一个线程拷贝一半,另一个线程拷贝另一半。
于 2024-06-14 07:27:44 首次发布