標籤:緩衝 shell linux linux核心
上面的代碼看上去很簡單,子子孫孫fork就是了,基本上符合我們的一般的猜想,邏輯上很正正確,但是要說的是:為什麼同樣的代碼啟動並執行時候得到的輸出會有不同?./fork執行完成之後很正常回到了shell,但是右邊卻沒有回到shell,這是為什麼呢?這和fork的性質【fork之後並不能確定究竟是哪個進程首先執行相關】左邊的情況是:最後一個進程4742執行完之後,父進程還是沒有結束的。然後父進程結束,回到父進程的父進程也就是shell右邊的情況是:在輸出[email protected]等等之前父進程就已經執行結束退出了所以後邊的子進程執行結束後不會回到shell,而是會回到他的父進程,不知道是誰了,反正不會是shell,所以會造成圖中所示的現象上面說的內容不是要說的重點內容,是個人理解,不一定對,歡迎指正!下面就來看看修改後的代碼的執行情況,就和我們乍一看程式猜想或者理解上的不一致了。
同樣的代碼只是將列印語句的最後的‘\n‘分行符號去掉了,運行效果確實差別很大:列印出了16條語句!!!這是為什麼呢?看列印語句的內容:其中第一條肯定是最初的進程列印的,這個不會有疑問,那麼他的pid就是4772,可以看到,這個4772被列印了9次剩下的7條分別是fork之後進程的進程pid為什麼會列印出9條?原來這和fork的第二條性質是相關的【fork後子進程會複製父進程的資源,緩衝區是父進程的資源,所以自然會複製一份】這樣就好理解了,最初的進程有7個子孫進程,所以都複製一份一開始的緩衝區,到本身結束的時候exit會沖洗緩衝區,其中包括複製父進程的緩衝區和自己需要列印的自己的pid內容最初的進程本身要列印兩次(一開始和最後)所以就會列印2+7*2-=16條,其中4772列印2+7=9條
既然這樣(子進程複製父進程的緩衝區),為什麼之前列印語句中帶有‘\n‘的實驗就能夠“正確”呢?這是由【裝置的不同緩衝屬性】決定的。我們現實運行結果的裝置是標準輸出裝置,而【標準輸出裝置在正常情況下是linux中的行緩衝的裝置(除出錯)】‘\n‘正是分行符號,所以會換行時清空緩衝。【linux中寫入檔案流是全緩衝的,也就是分行符號並不會沖洗緩衝區】我們讓結果輸出到檔案中會是怎樣的呢?
可以看到,不帶‘\n‘的輸出,除了沒有了shell的提示符外,分析還是相同的但是帶有‘\n‘的輸出到檔案之後,變成了全緩衝的了,所以自然也會輸出16條語句
想必經過這個實驗,能對fork的特性和裝置的特性有一個感性的認識了。。。。
Linux核心源碼學習之fork的緩衝區