題目:請問下面的程序一共輸出多少個“-”?
#include
#include
#include
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-");
}
return 0;
}
解析:一共輸出8個。
首先程序一開始,bash產生一個進程P1執行此程序,P1進入程序。
當i=0時:
fork()產生一個子進程P2,同時它自己輸出一個’-’。P2繼承P1的諸如環境變量,P2首現會輸出一個’-’。
當i=1,會繼續執行for循環—P2先fork()出一個子進程P3,同時再輸出一個’-’。
P3進程為P2的子進程,它會復制其父進程P2的指令,變量值,程序調用棧,環境變量,緩沖區等,它會輸出一個’-’。
此時P1進入程序后,當i=1時,fork()產生另一個它的子進程P4,同時輸出一個’-’。P4同樣會輸出一個’-’。
我們正常分析覺得應該產生6個’-’。
這是因為printf(“-”);語句有buffer,所以,對于上述程序,printf(“-”);把“-”放到了緩存中,在fork的時候,緩存被復制到了子進程空間,所以,就多了兩個,就成了8個,而不是6個。
因為這里P3會繼承P2的緩沖區,其中有一個’-’,所以P3會輸出兩個’-’。
因為P4為P1的一個子進程它會繼承P1的緩沖區,其中有一個’-’,所以P4會輸出兩個’-’。
若將程序改為:
#include
#include
#include int main(void)
{int i;for (i = 0; i<2; i++){fork();printf("-\n");}return 0;
}
則輸出六個。