1.多线程实现两个文件拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程资源
程序代码:
1 #include<myhead.h>
2 //定义要传递的结构体类型
3 typedef struct
4 {
5 const char *src;//原文件地址
6 const char *dest;//目标文件地址
7 int start;//光标起始位置
8 int len;//拷贝长度
9 }Bran;
10 int get_len(const char *srcfile,const char *destfile);
11 int copy_file(const char *srcfile,const char *destfile,int start,int len);
12 void *task(void *arg);
13 int main(int argc, const char *argv[])
14 {
15 //判断外部传参个数
16 if(argc!=3)
17 {
18 printf("input error\n");
19 printf("usage:./a.out srcfile destfile\n");
20 return -1;
21 }
22 //定义变量获取文件长度
23 int len=get_len(argv[1],argv[2]);
24 //定义线程号变量
25 pthread_t tid1,tid2;
26 //定义结构体数组存储,分支进程需要的参数
27 Bran t[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,(len-len/2)}};
28 //创建两个线程
29 if(pthread_create(&tid1,NULL,task,(void*)&t[0])!=0)
30 {
31 printf("tid1 create error\n");
32 return -1;
33 }
34
35 if(pthread_create(&tid2,NULL,task,(void*)&t[1])!=0)
36 {
37 printf("tid2 create error\n");
38 return -1;
39 }
40 //回收线程资源
41 pthread_join(tid1,NULL);
42 pthread_join(tid2,NULL);
43 printf("success\n");
44 return 0;
45 }
46 //获取文件长度
47 int get_len(const char *srcfile,const char *destfile)
48 {
49 //定义两个文件描述符变量
50 int srcfd,destfd;
51 //以只读形式打开源文件
52 if((srcfd=open(srcfile,O_RDONLY))==-1)
53 {
54 perror("open srcfile error");
55 return -1;
56 }
57 //以只写形式打开目标文件
58 if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
59 {
60 perror("open destfile error");
61 return -1;
62 }
63 //求文件大小
64 int len=lseek(srcfd,0,SEEK_END);
65 //关闭两个文件
66 close(srcfd);
67 close(destfd);
68 return len;
69 }
70 //定义拷贝函数
71 int copy_file(const char *srcfile,const char *destfile,int start,int len)
72 {
73 //定义两个文件描述符变量
74 int srcfd,destfd;
75 //以只读形式打开源文件
76 if((srcfd=open(srcfile,O_RDONLY))==-1)
77 {
78 perror("open srcfile error");
79 return -1;
80 }
81 //以只写形式打开目标文件
82 if((destfd=open(destfile,O_WRONLY))==-1)
83 {
84 perror("open destfile error");
85 return -1;
86 }
87 //移动文件光标
88 lseek(srcfd,start,SEEK_SET);
89 lseek(destfd,start,SEEK_SET);
90 //拷贝
91 char buf[128]="";
92 int sum=0;
93 while(1)
94 {
95 int res=read(srcfd,buf,sizeof(buf));
96 sum+=res;
97 if(sum>=len||res==0)
98 {
99 write(destfd,buf,res-(sum-len));//读取最后多余的数据写入文件
100 break;
101 }
102 //读取数据写入文件
103 write(destfd,buf,res);
104 }
105 //关闭文件
106 close(srcfd);
107 close(destfd);
108 return 0;
109 }
110 //分支线程函数
111 void *task(void *arg)
112 {
113 Bran t=*(Bran *)arg;
114 //分支线程拷贝后一半
115 copy_file(t.src,t.dest,t.start,t.len);
116 //退出线程
117 pthread_exit(NULL);
118 }
运行结果:
流程图: