fork() && fork() || fork()

 

fork() && fork() || fork()


  1. #include <unistd.h>  
  2. #include <stdio.h>  
  3.    
  4. int main()  
  5. {  
  6.         fork();/*****/  
  7.    
  8.         fork() && fork() || fork();/*****/  
  9.    
  10.         fork();/*****/  
  11.    
  12.         sleep(100);  
  13.    
  14.         return 0;  
  15. }  

問題是不算main這個進程自身,程序到底創建了多少個進程?

這是EMC的一道筆試題,感覺挺有意思的,這道題主要考了兩個知識點,一是邏輯運算符運行的特點;二是對fork的理解
如果有一個這樣的表達式:cond1 && cond2 || cond3 這句代碼會怎樣執行呢?
1、cond1爲假,那就不判斷cond2了,接着判斷cond3
2、cond1爲真,這又要分爲兩種情況:
  a、cond2爲真,這就不需要判斷cond3了
  b、cond2爲假,那還得判斷cond3
fork調用的一個奇妙之處在於它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的返回值:
1、在父進程中,fork返回新創建子進程的進程ID;
2、在子進程中,fork返回0;
3、如果出現錯誤,fork返回一個負值(題幹中說明了不用考慮這種情況)
在fork函數執行完畢後,如果創建新進程成功,則出現兩個進程,一個是子進程,一個是父進程。在子進程中,fork函數返回0,在父進程中,fork返回新創建子進程的進程ID。我們可以通過fork返回的值來判斷當前進程是子進程還是父進程。
有了上面的知識之後,下面我們來分析fork() && fork() || fork()會創建幾個新進程


很明顯fork() && fork() || fork()創建了4個新進程

總結:

第一註釋行的fork生成1個新進程
第二註釋行的三個fork生成4+4=8個新進程
第三註釋行的ork會生成10個新進程(這是因爲前面總共有10個進程,調用一次fork生成10個新進程)

所以一共會生成1+8+10=19個新進程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章