1. 程式人生 > >一道fork 建立了幾個程序的題目(轉的)

一道fork 建立了幾個程序的題目(轉的)

  1. #include 
  2. #include 
  3. int main()  
  4. {  
  5.         fork();
  6.         fork() && fork() || fork();
  7.         fork();
  8.         sleep(100);  
  9.         return 0;  
  10. }  

問題是不算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個新程序