linux學習--fork用法

linux當中可以使用fork函數創建一個新進程

#include <unistd.h>

pid_t fork(void);

返回值:子進程中返回0,父進程中返回子進程ID,出錯返回-1

在fork調用之後,子進程和父進程繼續執行fork調用之後的指令。子進程獲得父進程數據空間、堆和棧的副本,但是並不共享這些存儲空間部分。

fork的一個特性是父進程的所有打開文件描述符都被複制到子進程中。父、子進程的每個相同的打開描述符共享一個文件表項。

這種共享文件的方式使父、子進程對同一文件使用了一個文件偏移量。


這裏需要注意一下,父、子進程是共享正文段的,但是fork之後,子進程獲取到的PC(程序計數器)已經指向了fork之後的內容,所以,子進程只執行fork之後的代碼。


fork有兩種用法:

(1)一個父進程希望複製自己,使父、子進程同時執行不同的代碼段。例如,父進程等待客戶端的服務請求,然後fork一個子進程處理這個請求,自己則繼續等待下一個服務請求。

(2)一個進程要執行一個不同的操作。fork一個子進程之後立馬調用exec


fork的特殊應用:fork兩次可以避免僵死進程,(僵死進程是指一個已經終止,但是其父進程尚未對其進行善後處理的進程),父進程先fork一個子進程,子進程繼續fork一個孫子進程,然後就直接退出。這樣,父進程就可以很快的wait到子進程,釋放其資源,不需要阻塞,繼續自己的操作;而孫子進程交由了init進程託管,執行自己的操作而不用擔心了。

ps:write函數不帶緩衝,標準I/O庫是帶緩衝的,如果標準輸出練到終端設備,則它是行緩衝的,否則它是全緩衝的




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章