利用子进程拷贝文件的前半部分,副进程拷贝后半部分C代码
#include<myhead.h>
2 int main(int argc, const char *argv[])
3 {
4 //判断传入的文件个数
5 if(argc!=3)
6 {
7 printf("input error\n");
8 printf("usage:./a.out srcfile destfile\n");
9 return -1;
10 }
11 //定义进程号变量
12 pid_t pid=-1;
13 //定义文件描述符变量
14 int src,dest;
15 //以只读形式打开源文件
16 if((src=open(argv[1],O_RDONLY))==-1)
17 {
18 perror("open src error");
19 return -1;
20 }
21 //以只写的形式打开目标文件
22 if((dest=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
23 {
24 perror("open dest error");
25 return -1;
26 }
27 //光标求源文件大小
28 int len=lseek(src,0,SEEK_END);
29 //创建一个子程序
30 pid=fork();
31 //判断父子进程执行的程序代码
32 if(pid>0)
33 {
34 //两个文件定位到起始处
35 lseek(src,0,SEEK_SET);
36 lseek(dest,0,SEEK_SET);
37 //循环将源文件中的字符拷贝到目标文件
38 //定义容器存储读取的文件内容
39 char buf[128]="";
40 //每次读取的字符数
41 int res=0;
42 //读取的总字数
43 int sum=0;
44 while(1)
45 {
46 res=read(src,buf,sizeof(buf));
47 sum+=res;
48 if(sum>=len/2||res==0)
49 {
50 write(dest,buf,res-(sum-len/2));
51 break;
52 }
53 write(dest,buf,res);
54 }
55 }else if(pid==0)
56 {
57 lseek(src,len/2,SEEK_SET);
58 lseek(dest,len/2,SEEK_SET);
59 char duf[128]="";
60 int reb=0;
61 int sun=0;
62 while(1)
63 {
64 reb=read(src,duf,sizeof(duf));
65 sun+=reb;
66 if(sun>=len-(len/2)||reb==0)
67 {
68 write(dest,duf,reb-(sun-(len-len/2)));
69 break;
70 }
71 write(dest,duf,reb);
72 }
73 exit(EXIT_SUCCESS);
74 }else
75 {
76 perror("pid error");
77 return -1;
78 }
79 wait(NULL);//阻塞等待子进程结束
80 printf("success\n");
81 //关闭文件
82 close(src);
83 close(dest);
84 return 0;
85 }