題目:請問下面的程序一共輸出多少個“-”?
[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個'-'