做物品租赁网站,花生壳免费域名注册,廊坊建设网站,企业网站手机端开发学习了mmap以后#xff0c;实现一个简单的小程序#xff0c;进行多个进程对一个文件进行拷贝。
Linux mmap共享内存学习可以参考我的另一篇博客#xff1a;传送门
实现思想
我们可以将原来的文件利用mmap分成多个段分别进行传输。
实现代码
#includestdio.h
#…学习了mmap以后实现一个简单的小程序进行多个进程对一个文件进行拷贝。
Linux mmap共享内存学习可以参考我的另一篇博客传送门
实现思想
我们可以将原来的文件利用mmap分成多个段分别进行传输。
实现代码
#includestdio.h
#includestring.h
#includestdlib.h
#includeunistd.h
#includesys/types.h
#includesys/wait.h
#includesys/mman.h
#includefcntl.hint main(int argc,char *argv[])
{char *input,*output;if(argc2){printf(You should input file name\n);exit(1);}else if(argc3){printf(too many arguments\n);exit(1);}else if(3 argc){inputargv[1];outputargv[2];}else if(2 argc){inputargv[1];outputstrcat(input,.out);}int fd1 open(input,O_RDONLY);if(-1 fd1){perror(input file open error:);exit(1);}int fd2 open(output,O_RDWR | O_CREAT | O_TRUNC,0644);if(-1 fd2){perror(output file open error:);exit(1);}int file_size lseek(fd1,0,SEEK_END);int ret ftruncate(fd2,file_size);if(-1 ret){perror(ftruncate ouput file error:);exit(1);}input mmap(NULL, file_size, PROT_READ, MAP_SHARED, fd1, 0);if(MAP_FAILED input){perror(input mmap error:);exit(1);}close(fd1);output mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0);if(MAP_FAILED output){perror(output mmap error:);exit(1);}close(fd2);int psize file_size / 4;pid_t pid;for(int son0; son4; son){pid fork();if(-1 pid){perror(fork error:);exit(1);}else if(0 pid){memcpy(outputson*psize, inputson*psize, psize);exit(0);}}if(file_size psize * 4){memcpy(output4*psize,input4*psize,file_size-psize*4);}ret munmap(input, file_size);if(-1 ret){perror(close input mmap error:);exit(1);}ret munmap(output, file_size);if(-1 ret){perror(close output mmap error:);exit(1);}return 0;
}