1.使用多线程实现两个文件的拷贝
#include <myhead.h>
typedef struct{
const char *f1;//源文件
const char *f2;//目标文件
long start;//开始的字节
long end;//结束的字节
}lofo;
void* task(void *arg)
{
lofo *p = arg;
int f1,f2;
if((f1=open(p->f1,O_RDONLY))==-1)//以只读打开
{
perror("open error");
return NULL;
}
if((f2=open(p->f2,O_WRONLY))==-1)//以只写打开
{
perror("open error");
return NULL;
}
long size = p->end-p->start;
lseek(f1,p->start,SEEK_SET);
lseek(f2,p->start,SEEK_SET);
char a;
int c=0;
while(c<size)
{
read(f1,&a,1);
write(f2,&a,1);
c++;
}
close(f1);
close(f2);
}
int main(int argc,const char *argv[])
{
pthread_t tid;//线程id
int f1,f2;//f1为源文件,f2为目标文件
if((f1=open(argv[1],O_RDONLY))==-1)//以只读打开
{
perror("open error");
return -1;
}
if((f2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,664))==-1)//以读写打开,如果没有则创建,有就清空
{
perror("open error");
return -1;
}
long size = lseek(f1,0,SEEK_END);//计算f1长度
close(f1);
close(f2);
lofo arg[2]={{argv[1],argv[2],0,size/2},{argv[1],argv[2],size/2,size}};
if(pthread_create(&tid,NULL,task,&arg[0]))//使用线程执行前一半复制
{
perror("create error");
return -1;
}
if(pthread_create(&tid,NULL,task,&arg[1]))//使用线程执行后一半复制
{
perror("create error");
return -1;
}
sleep(1);
return 0;
}

该程序定义了一个结构体用于存储源文件和目标文件路径以及拷贝范围,然后在两个线程中分别处理文件的一半内容,实现同时拷贝,提高效率。主要涉及文件打开、lseek、read和write等系统调用。
1558

被折叠的 条评论
为什么被折叠?



