需求:實現檔案多程序拷貝
假設有乙個超大檔案,需對其完成拷貝工作。為提高效率,可採用多程序並行拷貝的方法來實現。假設檔案大小為len,共有n個程序對該檔案進行拷貝。那每個程序拷貝的位元組數應為len/n。但未必一定能整除,我們可以選擇讓最後乙個程序負責剩餘部分拷貝工作。可使用len % (len/n)將剩餘部分大小求出。
為降低實現複雜度,可選用mmap來實現源、目標檔案的對映,通過指標操作記憶體位址,設定每個程序拷貝的起始、結束位置。借助map_shared選項將記憶體中所做的修改反映到物理磁碟上。
實現源**如下:
#include #include #include #include #include #include #include #include void err_int(int ret, const char *err)
return ;
}void err_str(char *ret, const char *err)
}int main(int argc, char *ar**)
else if (argc == 3) else if (argc == 4)
//開啟原始檔
fd_src = open(ar**[1], o_rdonly);
err_int(fd_src, "open dict.txt err");
//開啟目的檔案, 不存在則建立
fd_dst = open(ar**[2], o_rdwr | o_creat | o_trunc, 0664);
err_int(fd_dst, "open dict.cp err");
//獲取檔案大小
ret = fstat(fd_src, &sbuf);
err_int(ret, "fstat err");
len = sbuf.st_size;
if (len < n) //檔案長度小於程序個數
n = len;
//根據檔案大小拓展目標檔案
ret = ftruncate(fd_dst, len);
err_int(ret, "truncate fd_dst err");
//為原始檔建立對映
mp_src = (char *)mmap(null, len, prot_read, map_shared, fd_src, 0);
err_str(mp_src, "mmap src err");
//為目標檔案建立對映
mp_dst = (char *)mmap(null, len, prot_read | prot_write, map_shared, fd_dst, 0);
err_str(mp_dst, "mmap dst err");
tmp_dstp = mp_dst;
tmp_srcp = mp_src;
//求出每個子程序該拷貝的位元組數
int bs = len / n; //每個子程序應該拷貝的位元組數
int mod = len % bs; //求出均分後餘下的位元組數,讓最後乙個子程序處理
//建立n個子程序
for (i = 0; i < n; i++)
}if (n == i) else if (i == (n-1)) else if (i == 0) else
munmap(mp_src, len);
munmap(mp_dst, len);
return 0;
}
多程序實現檔案拷貝
import multiprocessing import os import shutil 拷貝檔案任務 filename 檔名 src dir 源目錄 dst dir 目標目錄 def copy file file name,src dir,dst dir 原始檔的路徑 src file pat...
多程序檔案拷貝
下面用程式實現這樣的功能 有乙個檔案的內容需要拷貝到另乙個檔案中,以前的做法是用乙個程序來完成,下面要做的是,是兩個程序同時做這件事,乙個程序負責一半,如父程序負責拷貝檔案的前半段,子程序負責拷貝檔案的後半段。下面看一下程式的流程以及需要注意的問題 其中 要注意的是當父程序呼叫fork函式建立子程序...
mmap多程序拷貝檔案
include include include include include include include includeusing namespace std int main int argc,char ar stat ar 1 buf int len buf.st size 這裡必須要有讀...