使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源。
程序代码:
#include <myhead.h>
typedef struct
{
int start;//拷贝的起始位置
int end;//拷贝的结束位置
int source_fd;//被拷贝的源文件
int dest_fd;//拷贝出来的目标文件
}ThreadArg;
void *half_copy(void *arg)
{
ThreadArg *thread_arg =(ThreadArg *)arg;
lseek(thread_arg->source_fd,thread_arg->start,SEEK_SET);
lseek(thread_arg->dest_fd,thread_arg->start,SEEK_SET);
char buf[128];
int sum=0;
//循环写入
while(1)
{
int res=read(thread_arg->source_fd,buf,sizeof(buf));
sum+=res;
int len=thread_arg->end - thread_arg->start;
if(sum >=len ||res==0)
{
write(thread_arg->dest_fd,buf,res-(sum-len));
break;
}
write(thread_arg->dest_fd,buf,res);
}
}
int main(int argc, const char *argv[])
{
//打开源文件和目标文件
int source_fd,dest_fd;
if((source_fd=open("./02ptread.c",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
if((dest_fd=open("./test.txt",O_WRONLY|O_CREAT,0664))==-1)
{
perror("open error");
return -1;
}
int size=lseek(source_fd,0,SEEK_END);
int halfsize=size/2;
pthread_t thread1,thread2;
ThreadArg arg1 ={0,halfsize,source_fd,dest_fd};
ThreadArg arg2 ={halfsize,size,source_fd,dest_fd};
pthread_create(&thread1,NULL,half_copy,&arg1);
pthread_create(&thread2,NULL,half_copy,&arg2);
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
close(source_fd);
close(dest_fd);
return 0;
}
运行结果: