Fork:創建一個和當前進程映像一樣的進程可以通過fork( )系統調用:
10多年的東鄉網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網絡營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整東鄉建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯建站從事“東鄉網站設計”,“東鄉網站推廣”以來,每個客戶項目都認真落實執行。
#include sys/types.h
#include unistd.h
pid_t fork(void);
成功調用fork( )會創建一個新的進程,它幾乎與調用fork( )的進程一模一樣,這兩個進程都會繼續運行。在子進程中,成功的fork( )調用會返回0。在父進程中fork( )返回子進程的pid。如果出現錯誤,fork( )返回一個負值。
最常見的fork( )用法是創建一個新的進程,然后使用exec( )載入二進制映像,替換當前進程的映像。這種情況下,派生(fork)了新的進程,而這個子進程會執行一個新的二進制可執行文件的映像。這種“派生加執行”的方式是很常見的。
在早期的Unix系統中,創建進程比較原始。當調用fork時,內核會把所有的內部數據結構復制一份,復制進程的頁表項,然后把父進程的地址空間中的內容逐頁的復制到子進程的地址空間中。但從內核角度來說,逐頁的復制方式是十分耗時的?,F代的Unix系統采取了更多的優化,例如Linux,采用了寫時復制的方法,而不是對父進程空間進程整體復制。
看起來你這段程序很難結束了。
首先父進程會創建4個子進程;
然后,因為父子進程共用代碼段,于是子進程也會把for循環執行4次,每個子進程繼續4個子進程;
最后,子進程創建的子進程,依然會繼續創建4個子進程,所以,沒完沒了。
因fork會返回2個值,返回非零,是創建的子進程號,此時在父進程中;返回零是在子進程中;
所以,一般來說:應該根據fork的返回值來使代碼選擇不同的執行路徑,簡單舉例:
if (fork() !=0 )
{
parent process do something
}
else
{
child process do something
}
函數簽名: pid_t fork(void);
子進程中返回0,父進程中返回子進程ID,出錯返回-1
函數簽名:
pid_t waitpid(pid_t pid,int* stat_loc,int options);
函數簽名:
pid_t getpid(void);
pid_t getppid(void); //用于獲取父(parent)進程的pid
函數簽名:
void eixt(int status);
示例1 創建一個這樣的進程
創建一個如下的
fork()函數的作用:新建一個子進程。
可以這么看,fork的意思就是分支,所以就相當于在當前進程所運行到的位置分一個支流出來,然后,新進程與老進程都是從分叉點開始繼續運行(分叉點也就是fork()函數調用處)。
至于fork()函數的返回值:
子進程返回:0
父進程返回:0的整數(返回子進程ID號)
錯誤返回:-1
因此,若沒有錯誤,對于:
if(fork()==0)
{block A}
else
{block B}
在新進程中block A的內容會被執行,而在老進程中block B會被執行。