程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 另一道與fork有關的面試題

另一道與fork有關的面試題

編輯:C++入門知識

題目:請問下面的程序一共輸出多少個“-”?
[cpp] 
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
  
int main(void) 

   int i; 
   for(i=0; i<2; i++){ 
      fork(); 
      printf("-"); 
   } 
  
   return 0; 

一般熟悉fork機制會認為輸出為6個'-',但我們運行一下,輸出的是8個'-'.
基礎知識見上一個題.
>>>程序一開使,bash產生一個進程P1執行此程序,
>>>P1進入程序後,當i=0時,fork()產生一個子進程P2,同時它自己輸出一個'-'.
>>>P2繼承P1的諸如環境變量,PC等環境,P2首現會輸出一個'-'.同時此時i=1,會繼續執行for循環---P2先fork()出一個子進程P3,同時再輸出一個'-'.
>>>P3進程為P2的子進程,它會復制其父進程P2的指令,變量值,程序調用棧,環境變量,緩沖區等,它會輸出一個'-'
       因為這裡P3會繼承P2的緩沖區,其中有一個'-',所以P3會輸出兩個'-'.
>>>P1進入程序後,當i=1時,fork()產生另一個它的子進程P4,同時輸出一個'-'.
>>>P4同樣會輸出一個'-'.
       因為P4為P1的一個子進程它會繼承P1的緩沖區,其中有一個'-',所以P4會輸出兩個'-'.
我們正常如上分析覺得應該產生6個'-'.
但為什麼是8個呢,見紅色部分加上的分析.
這是因為printf(“-”);語句有buffer,所以,對於上述程序,printf(“-”);把“-”放到了緩存中,在fork的時候,緩存被復制到了子進程空間,所以,就多了兩個,就成了8個,而不是6個。
如果把上面的printf("-")改為
[cpp]
printf("-\n"); 
或著調用fflush清一下緩存.
[cpp]
printf("-"); 
fflush(stdout); 
都可以保正輸出6個'-'

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved