linux下多進程的檔案拷貝與進程相關的一些基礎知識

來源:互聯網
上載者:User

標籤:linux   進程   進程拷貝   

之前實現了用檔案IO的方式可以實現檔案的拷貝,那麼對於進程而言,我們是否也可以實現呢?

答案是肯定的。

進程資源:

首先我們先回顧一下,進程的運行需要哪些資源呢?其資源套件括CPU資源,記憶體資源,當然還有時間片資源,我們都知道進程是有 棧, 堆,  唯讀資料區段,  資料區段(已初始化的全域變數靜態變數),bss段(未初始化的),   程式碼片段還有一組寄存器值。

進程命令:

另外我們也可以通過 ps  -ef |grep 進程名命令來查看進程號(PID)和父進程號(PPID),之後還可以通過  

ps aux |grep 進程名或進程號來查看進程的狀態(R,T,S,Z,(+)...).通過 kill -訊號的序號或宏  PID來對訊號發各種訊號,注意這裡面的kill可不是殺死進程的意思,我們可以通過給進程發訊號來殺死進程kill -SIGKILL PID  ,當然我們可以通過 kill -l 來擷取宏名,其次我們通過nice 或renice來給我們的進程設定不同的優先順序,等等等等。

進程建立:

我們會用fork函數來建立進程,以前我們都很清除的知道,一個函數只可以返回一個返回值,那麼進程建立的函數也只返回一個嗎?答案是不對的,因為通過fork函數建立的進程,如果成功的話我們向父進程返回子進程的PID號,向子進程返回0,如果建立失敗,則向父進程返回-1。建立完子進程後,父進程從fork()的下一條語句開始執行,子進程也是從下一條語句執行嗎?

是的,因為建立子進程的時候拷貝父進程的pc寄存器值,而pc寄存器的值決定了你的進程是從什麼地方開始的,所以當建立完子進程後,我們的子進程的執行與父進程的執行系一樣的方式,但是注意他們兩個不是一塊進行的,也有先後關係,只是先後關係不確定,如果用vfork函數建立進程的話,那麼我們的子進程是先進行的。

那麼上面說了fork()函數與vfork()函數都可以建立進程,有什麼區別呢?

<1>fork建立子進程後,父子進程執行的順序是不確定的,父子進程的地址空間是獨立的。

<2>vfork建立完子進程後,保證子進先執行,父進程在子進程結束,或調用exec函數族後才開始執行,

並且父子進程共用同一地址空間【如果子進程調用了exec函數則子進程會獨立出來】。

那麼怎樣利用進程來進行檔案的拷貝呢?以及怎樣拷貝呢?具體實現的要求如下,父進程拷貝檔案的前一半子進程拷貝檔案的後一半,那麼效率上面我們肯定比一個進程高得多了,以上就是對進程知識的相關回顧,知識點有了,思路有了,那麼剩下的就只是代碼實現的問題了,也就是體力勞動了:

請看下面代碼的實現:


#include <head.h>//取得檔案大小int get_size_src(int fd_src){int len = 0;len = lseek(fd_src,0,SEEK_END);return len;}//./a.out fd_src fd_destint main(int argc, const char *argv[]){if(argc < 3){fprintf(stderr,"Usage : %s argv[1] argv[2]\n",argv[0]);exit(EXIT_FAILURE);}int fd_src,fd_dest;fd_src = open(argv[1],O_RDONLY);if(fd_src < 0){perror("File to open");exit(EXIT_FAILURE);}fd_dest = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd_dest < 0){perror("File to open");exit(EXIT_FAILURE);}int len = 0;len = get_size_src(fd_src);//獲得檔案大大小int pid = fork();if(pid < 0){perror("File to fork !");exit(EXIT_FAILURE);}char buf[1024];int n = 0;if(pid == 0)//如果是子進程{close(fd_src);close(fd_dest);fd_src = open(argv[1],O_RDONLY);if(fd_src < 0){perror("File to open");exit(EXIT_FAILURE);}fd_dest = open(argv[2],O_WRONLY);if(fd_dest < 0){perror("File to open");exit(EXIT_FAILURE);}lseek(fd_src,len/2,SEEK_SET);lseek(fd_dest,len/2,SEEK_SET);n = read(fd_src,buf,len/2);write(fd_dest,buf,n);close(fd_src);close(fd_dest);}else//如果是父進程的話{lseek(fd_src,0,SEEK_SET);lseek(fd_dest,0,SEEK_SET);n = read(fd_src,buf,len/2);write(fd_dest,buf,n);}return 0;}


註:

本程式用到的標頭檔本人直接封裝在了head.h中。如果有哪裡需要改進希望留言給我哈



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.