最近看《unix環境高階程式設計》,其中有講到建立子執行緒用fork的函式呼叫,這個函式特別之處是呼叫一次,返回兩次,分別為0和pid,這裡假定每次建立都是成功的。
為啥返回兩次呢,而且值不一樣呢?
返回兩次是系統呼叫的實現,需要檢視fork是如何實現的,這裡面就比較複雜了,鄙人現在不懂。
返回值不同,建立程序返回新生程序的id值,新生程序返回0,每乙個程序的父程序是確定的,可以通過getppid來獲取,但子程序的個數可以不止乙個,所以父程序中返回新生程序的id值。
然後需要注意的是fork和vfork的區別,fork乙個新生程序,(程序--資源分配的最小單位哦,親),新生程序和父程序是共享**段的,但資料段是父程序的拷貝,而vfork後,新生程序和父程序共享**段也共享資料段,不是拷貝。
當然fork之後,是新生程序先執行,還是父程序先執行,取決於程序排程,排程順序不一定。
好了,廢話扯了一堆,來看看下面的一道面試題目:
微軟的乙個選擇題目,問輸出的"-"有多少個?2個 4個 6 個 還是8個?
1 #include
2 #include
3 #include
4 int main(int argc ,char **argv)
5 12 return 0;
13 }
按照書上面講的來分析一下,假定初始化的程序id為idnum,
<1>
當他執行到9的時候,成功建立了乙個新生程序,假定id為idnum+1
這時idnum和idnum+1分別列印了一次,個數為2,執行拷貝資料,所以新生程序的i值現在為0
然後執行for迴圈的第3部分,這時idnum 和idnum+1的i值都變為了1
<2>
執行for迴圈的第2部分,再次執行到9行,程序為idnum的程序產生新的程序,假定為idnum+2
程序為idnum+1的程序產生新的程序,假定為idnum+3
這時新生程序idnum+2和新生程序idnum+3執行資料拷貝他們的i值現在為1
這時每個程序都列印了1次,所以個數為2+4=6個
這之後執行for迴圈體第3部分,現在所以的程序的i值都變為了2
<3>
執行for迴圈的第2部分,條件不成立,for迴圈結束,之後執行return 0.由於沒有寫訊號處理函式,系統負責sigend sigchid的處理,這時候執行拋棄?還是啥,不記得了,但系統會負責資源的**,是否會產生僵死程序呢,等下不防試驗一下。看看有沒有被掛到1號程序上面的新程序。理論完了,看看分析對不對,下面的部分是實驗所得。
實驗部分:
說明:使用的系統未ubuntu 10.04lts版本64位,2.6.32核心
實驗一
是不是很奇怪呢,列印出了8個-,不是之前我yy的6個。先別急,畢竟這本書粗略的看了一下,對linux也還沒入門好吧
等下進一步分析。
實驗二接下來的乙個題目非常有意思為啥這麼說,因為不仔細看,還以為題目出重複了
1 #include
2 #include
3 #include
4 int main(int argc ,char **argv)
5 12 return 0;
13 }
和上面的題目唯一的區別就是在第10行的輸出部分,加入了回車換行,仍然問輸出的「-」有多少個?2個 4個 6個 還是8個?
也不墨跡了,直接跑起來,下面是實驗結果:
這次貌似對了6個「-」,和我之前yy的結果是一樣的,但別得意,為啥這麼大的區別,到底是為什麼呢?緩衝區?引用計數?訊號處理?
蛋在這個時候已經不復存在。
還望高人指點一二。
那就在深究一下好了,還是實驗,通過加入getpid和getppid來看看輸出。
實驗三在實驗二的基礎上,稍微改動一下好了
ok,執行結果呢:
跟我上面yy的基本上符合,5303號程序為shell程序id吧,6493為shell為執行體第一載入的程序id,
輸出的內容會不一定,因為每次載入時分配的程序id是按照未分配的程序id往上加的,且程序之間執行順序的先後,和系統程序呼叫環境有關,
貼個證據:
除了shell的pid是相同的,最後有乙個程序的父id掛為了1,有孤兒程序出現,何謂孤兒程序,就是建立它的父程序已經消亡,子程序還沒執行完畢
這時系統會把這些程序掛到1號程序上去,成為1號程序的子程序
實驗結果就是:和我yy的過程是一致的,下面檢視下系統的程序,可以通過/proc目錄,也可以用ps命令檢視一下,不過發現找不到程序id為6584這樣的程序,
說明這些程序最後還是被系統給銷毀了
但這到底是為什麼呢,為什麼呢,希望高人指點一二,《unix高階程式設計》有時間必須看上好幾遍哦~~~~~5555555555555555
關於程序建立fork函式的理解
fork一次返回2個值,返回三類值。函式原型 pid t fork 正 fork父程序,返回子程序id 零 fork子程序,返回0 負 fork失敗。fock函式呼叫一次卻返回兩次。向父程序返回子程序的id,向子程序中返回0,這是因為父程序可能存在很多過子程序,所以必須通過這個返回的子程序id來跟蹤...
程序建立,程序等待,程序終止
1 程序建立,2 程序等待,3 程序終止 程序建立被定義為通過父程序建立子程序的過程。fork函式 函式原型 pid t fork void 特點 1.fork函式呼叫一次,返回兩次兩次返回值得區別分別是子程序當中的返回值為0,父程序當中的返回值為新建子程序的id 將id返回給父程序的原因是沒有函式...
程序排程之建立程序
do fork struct pid pid alloc pid struct pid pid kmem cache alloc pid cachep,gfp kernel 分配pid結構體空間 nr alloc pidmap current nsproxy pid ns 分配pid程序號 pid ...