linux中fork建立進程講解)
來源:互聯網
上載者:User
大家知道Linux中建立子進程的一個很好的方法是函數調用fork,但是很多初學者對fork的理解上可能有點困難。我們舉個例子來看看fork的用法吧。 大家用fork的時候記住fork是“分叉”的意思就很好理解了。 記得初學fork() 函數及遇到這個函數時,總是不能理解fork為什麼會這樣寫,就會分成父子兩個進程。
先看一下fork() 的傳統模式//--------------------------------------------------------begin
int pid=fork();
if(pid < 0){
//失敗,一般是該使用者的進程數達到限制或者記憶體被用光了
........
}
else if(pid == 0){
//子進程執行的代碼
......
}
else{
//父進程執行的代碼
.........
}
.........
//-------------------------------------------------------end
(這段代碼可能是有點問題的,稍後解釋),首先來看fork 的傳回值,有三種情況 -1,0,>0
-1: 當然是失敗了,也不會分裂成兩個進程. 返回0是子進程,返回〉0 是父進程,此時返回的值當然是資進程的pid了。 這裡是比較難理解的一個地方,他的可以這樣簡單的解釋: 當進程遇到fork調用時,將此進程整個拷貝一份,即子進程。此時,該進程的傳回值被設定為〉0,即剛才 拷貝產生的子進程pid,而在拷貝產生的進程中,將傳回值設定為0 。也就是此時已經有兩個進程,只有pid的值不同(忽略一起其他的設定)。 此時,兩個進程都從fork開始往下執行,只是pid不同,所以 if ..... else if .... esle 會根據pid不同來執行相應的代碼,並不是說某一部分是父進程的代碼,某一部分是自進程的代碼. 只是一些條件判斷而已.所以當fork後,真箇代碼都會被兩個進程執行,只是(fork成功時)子進程中的pid 為零,所以 else if條件成立,其它兩個不成立,所以執行else if中的代碼.父進程中pid >0的,所以else成立,執行其中的代碼. 如果for()k失敗,當然是返回-1,此時是沒有子進程的. 現在來看一下,fork傳回值,失敗,返回-1,linux下系統調用的一半慣例,錯誤碼在errno中. 0 子進程,因為可以通過getpid() 和getppid()擷取自己的進程和父進程的pid; >0 ,父進程中,此為fork()的子進程pid,因為進程中沒有可以擷取自己子進程pid的系統調用。此時就要把返回的pid儲存起來,以後用來控制子進程。例如程式退出時調用kill(pid,9)殺死自己的子進程。 最後我想跟大家說的是,fork之後是父進程先執行還是子進程先執行,這是取決於cpu調用演算法的,就是說他們誰先執行都有可能。本文出自 “厚德載物” 部落格,請務必保留此出處http://binux.blog.51cto.com/742827/163234