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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.