多进程拷贝文档

昨天练习多进程,写了多进程拷贝的代码,在此记录下。
多进程拷贝就是用多个进程对同一篇文档进行拷贝,若文档有len字节,则每个字节只需要拷贝
len/n个字节,但并不一定完全整除,我们只要让最后一个子进程负责剩余的字节就好。

因为进程之间是以时间片轮转的方式抢占CPU,所以只是理论上的比单进程快,在此只是作为练习。

 #include<stdio.h>
 #include<string.h>
 #include<unistd.h>
 #include<sys/wait.h>
 #include<sys/mman.h>
 #include<sys/types.h>
 #include<stdlib.h>
 #include<sys/fcntl.h>
 #include<sys/stat.h>
 int main(void)
 {
     pid_t pid;
     int fd=open("/home/ubuntu/text/a.txt",O_RDWR);//用读写的方式打开文档
     if(fd == -1)//若打开失败,打印错误。
     {
         perror("open_fd error:");
         exit(1);
     }
     struct stat statbuff;
     int set=stat("/home/ubuntu/text/a.txt",&statbuff);//将inode节点信息存储在statbuff
     int num=statbuff.st_size;//文件大小
     if(set == -1)//发生错误打印
     {
         perror("stat error:");
         exit(1);
     }
     int fd_1=open("/home/ubuntu/text/b.txt",O_RDWR|O_CREAT|O_TRUNC,0644);
     ftruncate(fd_1,statbuff.st_size);//将文件大小设为statbuff.st_size
     if(fd_1 == -1){//出错打印错误信息
         perror("open_fd_1 error:");
         exit(1);
     }
     char *mm=mmap(NULL,statbuff.st_size,PROT_READ,MAP_SHARED,fd,0);//mmap建立映射区
     if(mm == MAP_FAILED){//发生错误打印错误信息
         perror("mm_mmap error:");
         exit(1);
     }
     close(fd);//关闭文件
     char *mm_1=mmap(NULL,statbuff.st_size,PROT_WRITE,MAP_SHARED,fd_1,0);//mmap建立映射区
     if(mm_1 == MAP_FAILED)//出错打印错误信息
     {
         perror("mm_1_mmap error:");
         exit(1);
     }
     close(fd_1);//关闭文件
     int i;
     for(i=0;i<5;i++){//循环创建子进程
         pid=fork();
         if(pid == -1){
             perror("fork error:");
             exit(1);
         }
         else if(pid == 0)
         {
             if(i!=4)
             {
                 memcpy(mm_1+(statbuff.st_size/5)*i,mm+(statbuff.st_size/5)*i,statbuff.st_size/5);//子进程进行文档拷贝
             }
             else{
                 memcpy(mm_1+(statbuff.st_size/5)*i,mm+(statbuff.st_size/5)*i,num-(statbuff.st_size/5)*i);//最后一个子进程收尾
             }
             break;
         }
     }
        int a=munmap(mm,num);//关闭mm指向的映射区
     if(a == -1){//出错打印出错信息
         perror("munmap_mm error:");
         exit(1);
     }
     int b=munmap(mm_1,num);//关闭mm_1指向的映射区
     if(b == -1){//出错打印出错信息
         perror("munmap_mm_1 error:");
         exit(1);
     }

     pid_t vis=0;
     if(pid>0){//回收所有子进程
         while(vis!=-1){
             vis=wait(NULL);
         }
     }
     return 0;
  }

发布了31 篇原创文章 · 获赞 4 · 访问量 961

猜你喜欢

转载自blog.csdn.net/qq_39781096/article/details/102792519
今日推荐