linux中fork創建進程講解(轉)


大家知道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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM