多程序檔案拷貝

2021-09-06 08:26:11 字數 1704 閱讀 4786

下面用程式實現這樣的功能:有乙個檔案的內容需要拷貝到另乙個檔案中,以前的做法是用乙個程序來完成,下面要做的是,是兩個程序同時做這件事,乙個程序負責一半,如父程序負責拷貝檔案的前半段,子程序負責拷貝檔案的後半段。下面看一下程式的流程以及需要注意的問題:

其中 要注意的是當父程序呼叫fork函式建立子程序後,子程序同樣也把父程序所開啟的檔案描述符fd拷貝過來,但是,在核心當中的struct file結構體只有乙份。即:

這不是我們期望的,這樣會造成兩個程序之間的干擾,比如檔案的當前位置就不好控制。對於檔案描述符符可以這麼理解:

在每個程序的程序控制塊pcb當中有乙個結構體指標陣列 struct file *a = ;子程序建立時,也拷貝了父程序的這個指標陣列。每當乙個程序p1呼叫open函式都返回乙個整型的檔案描述符fd,同時核心空間就會產生乙個相應的struct file 型別的結構體,這個結構體的的位址就存放在該程序p1的pcb中的a[fd]中。而程序p1也是通過這個陣列來找到相應的檔案的,當程序p1

執行close(fd)後,描述符a中的a[fd]不再儲存相應的結構體的位址,注意:核心中那個結構體可能還存在,原因是雖然p1不再使用該檔案,但是其父程序或者子程序還使用該檔案,即只要有還指向該結構體的檔案描述符存在,他就不會釋放。還應該知道,同乙個檔案可以有多個struct file,即乙個檔案可以被開啟多次,每次的fd可能不同,但是開啟一次核心中就建立乙個關於這個檔案的struct file。

所以,在子程序中應該先將原始檔a和目標檔案b關閉,然後再開啟,這樣就不會相互干擾了。

即:

下面是程式:

#include #include #include #include #include #include #define n 64

int main(int argc, char *argv)

; ssize_t n, sum = 0;

if (argc != 3) //檢查輸入引數是否合法

if ((fdr = open(argv[1], o_rdonly)) == -1) //開啟原始檔

if ((fdw = open(argv[2], o_wronly | o_creat | o_trunc, 0666)) == -1) //開啟要寫的檔案,即目標檔案

if ((len = lseek(fdr, 0, seek_end)) == (off_t)-1) //求原始檔的長度len

printf("len=%ld\n", len);

if (-1 == ftruncate(fdw, len)) //將目標檔案變成空洞檔案,大小根源檔案相同。

if ((pid = fork()) == -1) //建立子程序

if (pid == 0)//child last 1/2

else

//parent first 1/2

}close(fdr);

close(fdw);

return 0;

}

拷貝完成了後,用 「diff 原始檔 目標檔案」進行檢查。

多程序實現檔案拷貝

import multiprocessing import os import shutil 拷貝檔案任務 filename 檔名 src dir 源目錄 dst dir 目標目錄 def copy file file name,src dir,dst dir 原始檔的路徑 src file pat...

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 這裡必須要有讀...

檔案拷貝器之多程序

import osimport multiprocessing import time,random 檔案拷貝器 1.取得原始檔 2.直接命名目標資料夾,在原檔案加 副本 3.建立目標檔案將愛 4.取得要拷貝的資料夾中的所有檔名 5.通過程序池去執行每乙個檔案拷貝任務 6.準備乙個還是你好俗,實現檔...