fork()前的printf打印兩次的問題

解釋

1、fork()的複製看這裏:fork()的一些細節 - http://blog.csdn.net/duyiwuer2009/article/details/8022252

緩衝區也會被複制到子進程的進程空間

2、如果標準輸出連接到終端設備,則它是行緩衝的,否則它是全緩衝的。因此,當輸出到終端設備時,如果加'\n',調用printf()之後緩衝區會立馬被沖刷,輸出的內容就不會複製到子進程的進程空間中。


轉載:http://blog.csdn.net/wsniyufang/article/details/7420811 內容如下:

這幾天在看Linux應用編程, 測試了一下里面所講的fork函數。 不是說子進程會從fork語句處開始運行嗎? 爲啥之前的printf內容還會被輸出。 在網上找了一下,大概是這麼回事:

———————————————————————————–
main()
{
int a;
int pid;
printf(“AAAAAAAA”); // 這裏爲什麼會被print 2次
pid=fork();
if(pid==0){
printf(“ok”);}
else if(pid>;0){
printf(“is ok\n”);
}
printf(“BBBBBBB”);
}
—————————————————————————————
如果你將 printf(“AAAAAA”) 換成 printf(“AAAAAA\n”) 那麼就是隻打印一次了.
主要的區別是因爲有了一個 \n 回車符號
這就跟Printf的緩衝機制有關了,printf某些內容時,操作系統僅僅是把該內容放到了
stdout的緩衝隊列裏了,並沒有實際的寫到屏幕上
但是,只要看到有 \n 則會立即刷新stdout,因此就馬上能夠打印了.
運行了printf(“AAAAAA”) 後, AAAAAA 僅僅被放到了緩衝裏,再運行到fork時,緩衝裏面
的 AAAAAA 被子進程繼承了
因此在子進程度stdout緩衝裏面就也有了 AAAAAA.
所以,你最終看到的會是 AAAAAA 被printf了2次!!!!
而運行 printf(“AAAAAA\n”)後, AAAAAA 被立即打印到了屏幕上,之後fork到的子進程裏
的stdout緩衝裏不會有 AAAAAA 內容
因此你看到的結果會是 AAAAAA 被printf了1次!!!!

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