1.使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源
程序代码:
1 #include<myhead.h>
2 int get_len(const char *srcfile,const char *destfile);
3 int copy_file(const char *srcfile,const char *destfile,int start,int len);
4 int main(int argc, const char *argv[])
5 {
6 if(argc!=3)
7 {
8 printf("input error\n");
9 printf("usage:./a.out srcfile destfile\n");
10 return -1;
11 }
12 int len=get_len(argv[1],argv[2]);
13 pid_t pid=fork();
14 if(pid>0)
15 {
16 //父进程
17 copy_file(argv[1],argv[2],0,len/2);
18 //阻塞等待子进程结束
19 wait(NULL);
20 }else if(pid==0)
21 {
22 //子进程
23 copy_file(argv[1],argv[2],len/2,len-len/2);
24 //退出进程
25 exit(EXIT_SUCCESS);
26 }else
27 {
28 perror("fork error");
29 return -1;
30 }
31 printf("success\n");
32 return 0;
33 }
34 int get_len(const char *srcfile,const char *destfile)
35 {
36 //定义文件描述符变量
37 int srcfd,destfd;
38 if((srcfd=open(srcfile,O_RDONLY))==-1)
39 {
40 perror("open error");
41 return -1;
42 }
43 if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
44 {
45 perror("open error");
46 return -1;
47 }
48 int len=lseek(srcfd,0,SEEK_END);
49
50 close(srcfd);
51 close(destfd);
52 return len;
53 }
54 int copy_file(const char *srcfile,const char *destfile,int start,int len)
55 {
56 int srcfd,destfd;
57 if((srcfd=open(srcfile,O_RDONLY))==-1)
58 {
59 perror("open error");
60 return -1;
61 }
62 if((destfd=open(destfile,O_WRONLY))==-1)
63 {
64 perror("open error");
65 return -1;
66 }
67 lseek(srcfd,start,SEEK_SET);
68 lseek(destfd,start,SEEK_SET);
69
70 char buf[128]="";
71 int sum=0;
72 while(1)
73 {
74 int res=read(srcfd,buf,sizeof(buf));
75 sum+=res;
76 if(sum>=len||res==0)
77 {
78 write(destfd,buf,res-(sum-len));
79 break;
80 }
81 write(destfd,buf,res);
82 }
83 close(srcfd);
84 close(destfd);
85 return 0;
86 }
运行结果:
流程图: