fork函数原型与用法
? 在學習UNIX編程時,必須要學習的一個函數為fork函數。fork函數也為面試中必定要問的一個問題,尤其是在BAT的面試中,fork函數相關問題更為面試筆試必考知識點。究其原因:該函數為UNIX中派生新進程的唯一方法。不熟悉fork,就不可能熟悉多線程編程。因此掌握好fork函數,為程序員和準程序員必備技能。
1、 fork函數原型
<pre name="code" class="cpp">#include<unistd.h> pid_t fork(void);</span>返回:在子進程中返回0,在父進程中返回子進程的id,出錯返回-1.
? 返回:在子進程中返回0,在父進程中返回子進程的id,出錯返回-1.
? 如果之前從未接觸過這個函數,那么理解fork函數的最困難之處在于調用它一次,它卻返回兩次。它在調用進程(成為父進程)中返回一次,返回值為新派生進程(成為子進程)的進程ID號;在子進程中又返回一次,返回值為0.因此,返回值本身告知當前進程是子進程還是父進程。
? fork在子進程中返回0而不是父進程的ID的原因在于:任何子進程只有一個父進程,而且子進程總是可以通過調用getppid取得父進程的ID。相反,父進程可以有許多子進程,而且無法獲得各個子進程的進程ID。如果父進程想要跟蹤所有子進程的ID,那么它必須記錄每次調用fork的返回值。
?父進程中調用fork之前打開所有的描述字在fork返回之后由子進程分享。我們將看到網絡服務器便利用了這個特性:父進程調用accept之后調用fork。所接受的已連接的套接口隨后就在父進程與子進程之間分享。通常情況下,子進程接著讀和寫這個套接口,父進程則關閉這個已連接套接口。
2、 fork用法
? fork有兩個典型的用法:
? 1 一個進程創建一個自身的拷貝,這樣每個拷貝都可以在另一個拷貝執行其他任務的同時處理各自的某個操作。這是網絡服務器的典型用法。
? 2 一個進程想要執行另一個程序。既然創建新進程的唯一方法為調用fork,該進程于是首先調用fork創建一個自身的拷貝,然后其中一個拷貝(通常為子進程)調用exec把自身替換成新的程序。這是諸如shell之類程序的典型用法。
? 3 exec函數
? 存放在硬盤上的可執行文件能夠被UNIX執行的唯一方法是:由一個現有進程調用六個exec函數中的某一個。exec把當前進程映像替換成新的進程文件,而且該新程序通常從main函數處開始執行。進程ID并不改變。我們稱調用exec的進程為調用進程,稱新執行的程序為新程序。
六個exec函數的區別在于:
(a)待執行的程序文件是由文件名還是由路徑名指定;
(b)新程序的參數是一一列出還是由一個指針數組來引用;
(c)把調用進程的環境傳遞給新程序還是給新程序指定新的環境。
|#include<unistd.h> |int execl(const char *pathname, const char *arg0,.../* (char *)0 */); |int execv(const char *pathname, char *const argv[]); |int execle(const char *pathname, const char *arg0,.../* (char *)0,char *const envp[] */); |int execve(const char *pathname, char *const argv[], char *const envp[]); |int execlp(const char *filename, const char *arg0,.../* (char *)0 */); |int execvp(const char *filename, char *const argv[]); | 所有六個函數返回:-1——失敗,無返回——成功
? 這些函數只在出錯時才返回到調用者。否則,控制將傳遞給新程序的起始點,通常就是main函數。
?這六個函數之間的關系如下圖所示。一般來說,只有 execve 是內核中的系統調用,其他五個都是調用 execve 的庫函數。
注意這六個函數的下列區別:
? 1 頂行三個函數把新程序的每個參數字符串指定成exec的一個獨立參數,并以一個空指針結束可變數量的這些參數。底行三個函數都有一個作為exec參數的argv數組,其中含有指向新程序各個參數字符串的所有指針。既然沒有指定參數字符串的數目,這個argv數組必須含有一個用于指定其末尾的空指針。
? 2 左列兩個函數指定一個filename參數。exec將使用當前的PATH環境變量把該文件名參數轉換為一個路徑名。然而如果這兩個函數的filename參數中不論何處含有一個斜杠(/),PAHT變量就不再使用。右兩列四個函數指定一個全限定的pathname參數。
? 3 左兩列四個函數不顯式指定一個環境指針。相反,他們使用外部變量environ的當前值來構造一個傳遞給新程序的環境清單。右列兩個函數顯式指定一個環境清單,其envp指針數組必須以一個空指針結束。
————————————————
原文鏈接:https://blog.csdn.net/bad_good_man/article/details/49364947
總結
以上是生活随笔為你收集整理的fork函数原型与用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《每日一题》NO.23:谈谈对数字集成电
- 下一篇: aTrust项目的相关操作与分享