day4 IO 多进程

 day4 IO 多进程_第1张图片day4 IO 多进程_第2张图片day4 IO 多进程_第3张图片

创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源

  1 #include
  2 
  3 int main(int argc, const char *argv[])
  4 {
  5     //判断传入的文件个数
  6     if(argc != 3)
  7     {
  8         printf("input file error\n");
  9         printf("usage:./a.out srcfile dstfile\n");
 10         return -1;
 11     }
 12     //定义文件描述符变量
 13     int srcfd, dstfd;
 14 
 15     //以只读的形式打开源文件
 16     if((srcfd = open(argv[1], O_RDONLY)) ==-1)
 17     {
 18         perror("open srcfile error");
 19         return -1;
 20     }
 21     //以只写的形式打开目标文件
 22     if((dstfd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0664)) ==-1)
 23     {
 24         perror("open dstfile error");
 25         return -1;
 26     }
 27     unsigned int size;
 28     size = lseek(srcfd, 0, SEEK_END);
 29     pid_t pid1 = -1;
 30     //创建出一个子进程
 31     pid1 = fork();
 32     if(pid1 == 0)
 33     {
 34         lseek(srcfd,size/2,SEEK_SET);
 35         //不断得将源文件中的内容读出,并写入的目标文件中                                                                        
 36         //直到源文件读取后一半结束
 37         char buf[128] = "";
 38         while(1)
 39         {
 40             memset(buf, 0, sizeof(buf));    //将容器清空
 41             int res = read(srcfd, buf, sizeof(buf));   //从源文件中读取数据
 42             //对读取的数据个数进行判断
 43             if(res==0)
 44             {
 45                 break;
 46             }
 47             write(dstfd, buf, res);     //将数据写入目标文件
 48 
 49         }
 50         //关闭两个文件
 51         close(srcfd);
 52         close(dstfd);
 53         exit(EXIT_SUCCESS);
 54     }
 55     else if(pid1 > 0)
 56     {
 57         //创建一个子进程
 58         pid_t pid2 = fork();
 59         if(pid2 == 0)
 60         {
 61             //不断得将源文件中的内容读出,并写入的目标文件中
 62             //直到源文件读取一半结束
 63             char buf[1] = "";
 64             int count=0;
 65             lseek(srcfd,0,SEEK_SET);
 66             while(1)
 67             {
 68 
 69                 memset(buf, 0, sizeof(buf));    //将容器清空
 70 
 71                 int res = read(srcfd, buf, sizeof(buf));   //从源文件中读取数据
 72                 count+=res;
 73 
 74                 //对读取的数据个数进行判断
 75                 if(count>size/2)
 76                 {
 77                     break;
 78                 }
 79                 write(dstfd, buf, res);     //将数据写入目标文件
 80 
 81             }
 82             //关闭两个文件
 83             close(srcfd);
 84             close(dstfd);
 85             exit(EXIT_SUCCESS);
 86         }
 87         else if(pid2 > 0)
 88         {
 89             wait(NULL);
 90             wait(NULL);
 91         }
 92         else
 93         {
 94             perror("fork error");
 95             return -1;
 96         }
 97     }
 98     else
 99     {
100         perror("fork error");
101         return -1;
102     }
103     return 0;
104 }

day4 IO 多进程_第4张图片day4 IO 多进程_第5张图片

你可能感兴趣的:(linux)