C++ pipe與buffer overflow
本篇主要講述C++中pipe()函數的相關行為
因為pipe的buffer大小並非無限大,如果輸入流資料量過大,很有可能會碰到buffer塞滿而輸入還沒結束的問題
寫了以下的code來測試pipe buffer如果塞爆了會發生甚麼事情
實驗
1 |
|
實際編譯執行後,出現以下結果
Child2卡在第1897次輸出就寫不下去了,當然第一個process也是卡住的狀態(見Ps)
Pipe特性
從這個小實驗可以知道一些事情
pipe的buffer有限,是會被塞爆的
原生的pipe如果被寫滿,會讓想繼續寫入的所有process被卡住不能繼續執行,直到pipe被讀取
- 不可以wait process完整寫入發signal以後才fork另一個process再讀取,這樣很可能導致整個程式卡死
- 如果卡住的process太多,可能會讓父process再也fork不出東西來讓本該讀取的process去接,造成整個程式卡死
- 不可以wait process完整寫入發signal以後才fork另一個process再讀取,這樣很可能導致整個程式卡死
要注意針對大資料的處理,pipe應該要有個”抒發管道”,不能期待他真的裝下全世界
補充
我另外做了一個反向實驗:
讓輸入資料的process延遲輸入,而讀取的process開始讀空的pipe,得到以下心得
- 讀取端會等read(fd,char* buffer,int size)裡面的size被填滿才會執行接下來的動作
- 想到以前上課老師說的,只要還有process 對pipe的輸入端還未關閉,讀取端就會一直認為有東西要進來,而呆呆地等 -> 關不用的stream很重要!
P.S
測試這個東西的時候還有用背景執行,創造了不少卡著的process
其中相連的pid可以看出來是同一個程式來的,原本的父process,連帶所有child process都無法被正常結束…