Linux 實現檔案的多程序拷貝

2021-10-04 09:54:31 字數 1834 閱讀 1607

需求:實現檔案多程序拷貝

假設有乙個超大檔案,需對其完成拷貝工作。為提高效率,可採用多程序並行拷貝的方法來實現。假設檔案大小為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 這裡必須要有讀...