一、fork().建立進程的方式有兩種,一種系統建立,一種父進程建立。
1、fork()系統調用可以建立一個新的進程,新的進程將成為調用fork的進程的子進程。so,新的進程是調用fork進程的子進程。子進程繼承父進程幾乎所有的資源,如進程程式碼片段和使用者資料區段。但不繼承父進程設定的檔案鎖、父進程設定的警告。
2、建立一個子進程後,父子進程會爭奪CPU,搶到者執行,未搶到者掛起等待。
3、調用 wait()或waitpid() ,可以使用父進程等待子進程執行完畢在執行當前程式。
4、fork()調用一次會有兩個不同傳回值。一個是父進程調用fork()後的傳回值,其值為子進程ID,另外一個是子進程調用fork()的傳回值,其值為 0.
5、子進程共用父進程開啟的檔案描述符,但父進程對檔案描述符的改變不會影響子進程中的檔案描述符。
二、vfork()用法與fork()大致相同,但有些獨特之處
1、使用fork()時只是對父進程資源的複製。而vfork()並不將父進程的地址空間完全複製,而是共用父進程的地址空間。,也就是說子進程完全運行在父進程之上。子進程對資料的修改父進程也可見。
2、fork()建立子進程後,那個進程運行是不確定的。但vfork()時保證子進程先運行。當調用exec()或exit()後父進程才運行。
三、守護進程守護進程是指在後台啟動並執行、沒有控制終端與之相連的進程。編寫守護進程以下步驟。
1、讓進程後台運行。方法是調用fork()產生一個子進程。然後讓父進程退出。
2、調用ssid()建立一個新會話期。
3、禁止進程從新開啟控制終端。方法是再一次調用fork()建立一個子進程,在使調用fork()的進程退出。
4、關閉不在使用的檔案描述符。方法是使用for()迴圈,關閉從0到 最高的值的檔案描述符值。
5、更改目前的目錄為根目錄。使進程不在與檔案系統聯絡。方法使用chdir("/")。
6、將 檔案建立時的屏蔽字設定為0.方法使用umask(0)將屏蔽字清零。
7、處理SIGCHID訊號。
四、關於exec()
調用fork()或vfork()後一般會使用exec()執行一個新的程式。但並不是產生新的進程,而是廢棄原來程式的資料區段和堆棧段。