首頁  >  文章  >  後端開發  >  C中fork()和exec()的差別是什麼? fork()和exec()的簡單比較

C中fork()和exec()的差別是什麼? fork()和exec()的簡單比較

青灯夜游
青灯夜游原創
2019-04-01 15:02:006079瀏覽

每一個應用(程式)都是透過進程的方式來執行的,進程是一個正在運作的程式實例。進程是透過不同的系統呼叫創建的,最受歡迎的是fork()和exec(),那麼它們之間有什麼區別?以下這篇文章就來跟大家介紹fork()和exec()的差別,希望對大家有幫助。

C中fork()和exec()的差別是什麼? fork()和exec()的簡單比較

C語言中的fork()

pid_t pid = fork();

fork()透過複製呼叫程序來創建一個新進程,產生了一個新的PID,新進程(稱為子進程)是呼叫進程(稱為父進程)的精確副本。兩個進程幾乎完全相同,除了以下情況:

 1、子進程具有自己的唯一進程ID,且此PID與任何現有進程組的ID都不符。

 2、子程序的父行程ID與呼叫程序的ID相同。

 3、子級不繼承其父級的記憶體鎖定和訊號量調整。

 4、子級不從其父級繼承未完成的非同步I/O操作,也不從其父級繼承任何非同步I/O上下文。

fork()的回傳值

fork()不接受任何參數並傳回整數值。下面是fork()回傳的不同值。

 ● 負值:建立子程序失敗。

 ● 零:返回新建立的子程序。

 ● 正值:傳回父母或來電者。該值包含新建立的子進程的進程ID。

說明:一旦成功,子進程的PID將在父進程中返回,而將在子進程中返回0。失敗時,在父進程中返回-1,不建立子進程,並適當地設定errno。

C語言中的exec()

#exec()函數系列將目前進程映像替換為新的進程映像。它將程式載入到當前進程空間,並從入口點運行它。

範例:我們已經在下面的C程式中實作了execv(),exec()系列由下列函數組成,

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

fork()和exec( )之間的區別

1、fork()建立啟動一個新進程,該進程是呼叫它的進程的副本,兩個進程完全相同;而exec()則用另一個(不相同的)進程映像替換當前進程映像,當前進程的“資料段”,“堆疊段”和“程式碼段”被新程式改寫。

2、fork()建立一個新的進程就產生了一個新的PID,因此子進程擁有自己的進程ID。 exec啟動一個新程序,取代原有的進程,因此新程式會保持呼叫exec()進程的ID不變,也就是這個新的被exec執行的進程的PID不會改變,和呼叫exec函數的進程一樣。

3、fork()之前父進程 打開的檔案描述符,在子進程中同樣打開,並且都指向相同的檔案表項。而,呼叫exec()之前開啟的描述字會繼續開啟。

相關影片教學推薦:《C語言教學

以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。更多精彩內容大家可以追蹤php中文網相關教學欄位! ! !

以上是C中fork()和exec()的差別是什麼? fork()和exec()的簡單比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn