1>使用父子进程完成两个文件的拷贝
父进程拷贝前一般内容,子进程拷贝后一半内容
子进程结束后退出,父进程回收子进程的资源
1 #include <sys/wait.h>
2 #include<myhead.h>
3 int main(int argc, const char *argv[])
4 {
5 //判断文件
6 if (argc != 3) {
7 perror("file error");
8 return -1;
9 }
10
11 //打开文件
12 int fd1=-1;
13 if((fd1=open(argv[1],O_RDONLY))==-1) //打开源文件
14 {
15 perror("open error");
16 return -1;
17 }
18
19 int fd2=-1; //打开目标文件
20 if((fd2=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0777))==-1)
21 {
22 perror("open error");
23 return -1;
24 }
25
26
27 char buf[128]="";
28 int res=0;
29 int sum = 0;
30
31 //循环统计字节总数
32 while(1)
33 {
34 res=read(fd1,buf,sizeof(buf));
35 sum+=res;
36 if(res==0)
37 {
38 break;
39 }
40 }
41
42 //定义进程号
43 pid_t pid =fork(); //创建一个子进程
44 if(pid==-1)
45 {
46 perror("fork error");
47 return -1;
48 }
49
50 if (pid > 0) //父进程
51 {
52 // 父进程拷贝前一半内容
53 lseek(fd1, 0, SEEK_SET); // 文件指针到开始位置
54 int half = sum / 2; //文件一半
55 int num=0;
56 while (num<half)
57 {
58 read(fd1, buf,1);
59 if (res == 0)
60 {
61 break;
62 }
63 write(fd2, buf,1);
64 num++;
65 }
66
67 }
68 else
69 { // 子进程
70 // 子进程拷贝后一半内容
71 int half = 0;
72 lseek(fd1, half, SEEK_SET); // 移动到文件的中间位置
73 while (1)
74 {
75 res = read(fd1, buf, sizeof(buf));
76 if (res == 0)
77 {
78 break;
79 }
80 write(fd2, buf, res);
81 }
82 exit(EXIT_SUCCESS); // 子进程完成任务后退出
83 }
84
85 wait(NULL);
86
87 close(fd1);
88 close(fd2);
89 return 0;
90 }
思维导图