日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用mmap实现大文件的复制:单进程与多进程情况

發布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用mmap实现大文件的复制:单进程与多进程情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單線程和多進程實現文件的復制(mmap方法)

mmap實現大文件的復制

  • 單線程和多進程實現文件的復制(mmap方法)
  • 一、單線程實現
  • 二、多進程實現

一般文件實現方法:
1.讀取(fread)要復制的文件
2.寫入(fwrite)目標文件
mmap實現方法:
1.源文件和目標映射到內存空間
2.memcpy進行拷貝

一、單線程實現

#include <cstdio> #include <stdio.h> #include <iostream> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <memory.h> using namespace std;int file_size(char* filename) {struct stat statbuf;stat(filename,&statbuf);int size = statbuf.st_size;return size;}int main(int argc,char* argv[]) {//參數一:要拷貝的文件路徑名if (argv[1] == ""){printf("參數不能為空");exit(1);}//參數二:目標文件路徑名if (argv[2] == ""){printf("參數不能為空");exit(1);}void* s_ptr;void* o_ptr;int s_ret=0,o_ret=0;//打開源文件,只讀模式s_ret = open(argv[1],O_RDONLY);if (s_ret == -1){perror("file error:");exit(1);}//目標模式,沒有則創建,只寫模式o_ret = open(argv[2], O_CREAT|O_RDWR,0644);if (o_ret == -1){perror("file error:");exit(1);}//獲取文件大小int size = file_size(argv[1]);//printf("file size: %d \n",size);//擴展目標文件ftruncate(o_ret,size);//內存映射s_ptr=mmap(NULL, size, PROT_READ, MAP_PRIVATE, s_ret, 0);o_ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, o_ret, 0);if (o_ptr == MAP_FAILED){perror("s_ptr mmap error:");exit(1);}//關閉文件描述符close(s_ret);close(o_ret);//實現拷貝memcpy(o_ptr,s_ptr,size);//釋放映射空間munmap(s_ptr,size);munmap(o_ptr, size);return 0; }

二、多進程實現

#include <cstdio> #include <stdio.h> #include <iostream> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <memory.h> #include <sys/wait.h> using namespace std;int file_size(char* filename) {struct stat statbuf;stat(filename,&statbuf);int size = statbuf.st_size;return size;}int main(int argc,char* argv[]) {//參數一:要拷貝的文件路徑名if (argv[1] == ""){printf("參數不能為空");exit(1);}//參數二:目標文件路徑名if (argv[2] == ""){printf("參數不能為空");exit(1);}char* s_ptr;char* o_ptr;int n = 5;//創建子進程的個數int s_ret=0,o_ret=0;int i=0;//打開源文件,只讀模式s_ret = open(argv[1],O_RDONLY);if (s_ret == -1){perror("file error:");exit(1);}//目標模式,沒有則創建,只寫模式o_ret = open(argv[2], O_CREAT|O_RDWR,0644);if (o_ret == -1){perror("file error:");exit(1);}//獲取文件大小int size = file_size(argv[1]);//printf("file size: %d \n",size);//擴展目標文件ftruncate(o_ret,size);//內存映射s_ptr=(char*)mmap(NULL, size, PROT_READ, MAP_PRIVATE, s_ret, 0);o_ptr = (char*)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, o_ret, 0);if (o_ptr == MAP_FAILED){perror("s_ptr mmap error:");exit(1);}//關閉文件描述符close(s_ret);close(o_ret);//實現拷貝int each_size = size / n;int last_size = size - (n * each_size);pid_t pid;//循環創建子進程for (i = 0; i < n; i++){pid = fork();if (pid == 0){break;//子進程退出循環}}if (n == i)//主進程{sleep(i);memcpy(o_ptr + i * each_size, s_ptr + i * each_size, last_size);waitpid(-1,NULL, WNOHANG);}else{sleep(i);memcpy(o_ptr + i * each_size, s_ptr+ i * each_size, each_size);}//釋放映射空間munmap(s_ptr,size);munmap(o_ptr, size);return 0; }

不完美的地方
主進程只是采用sleep函數來避免子進程變成僵尸進程,用信號的方式可以改進。

總結

以上是生活随笔為你收集整理的使用mmap实现大文件的复制:单进程与多进程情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。