IO进程:多进程实现文件的拷贝

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 }   

运行结果:

流程图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值