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. Linux根据进程ID查看进程文件路径

    2024-02-22 14:58:01       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-22 14:58:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-22 14:58:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-22 14:58:01       87 阅读
  4. Python语言-面向对象

    2024-02-22 14:58:01       96 阅读

热门阅读

  1. 近红外γ-谷氨酰转肽酶(GGT)荧光探针(NRh-G)星戈瑞

    2024-02-22 14:58:01       52 阅读
  2. 物联网和人工智能的融合

    2024-02-22 14:58:01       60 阅读
  3. android 全局异常处理封装

    2024-02-22 14:58:01       52 阅读
  4. C语言内存模型的深度剖析

    2024-02-22 14:58:01       51 阅读
  5. 自然语言转SQL的应用场景探索

    2024-02-22 14:58:01       50 阅读
  6. 剑指offer面试题17 合并俩个排序的列表

    2024-02-22 14:58:01       49 阅读
  7. sqlserver 函数

    2024-02-22 14:58:01       50 阅读
  8. 算法:带权重随机算法

    2024-02-22 14:58:01       49 阅读
  9. spring和springboot的区别,简单直接

    2024-02-22 14:58:01       52 阅读
  10. Python程序员面试准备:八股文题目与解答思路

    2024-02-22 14:58:01       48 阅读
  11. LINUX下载安装go

    2024-02-22 14:58:01       50 阅读