作业2/20

利用子进程拷贝文件的前半部分,副进程拷贝后半部分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 } 

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值