看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《hubert100 ()》之銘言: : #include <stdio.h> : main() : { : fork(); printf("a"); : fork(); printf("b"); : } : 結果:abababab 剛剛也想了一陣子,覺得很奇怪 突然發現,原來是 stdout 的 buffer 問題 在預設的情況下,使用 printf 時並不會馬上輸出,而會先留在記憶體裡面 因此 a 還在記憶體裡,就一併被帶到 child process 了 修改如下: main() { fork(); printf("a"); printf("\n"); 或者 fflush(stdout); 強制把 buffer 的 "a" 寫出去 fork(); printf("b"); } 或者把 printf 改成 fprintf(stderr, ...); 也不會有這種情況 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46 ※ 編輯: james732 來自: 140.117.171.46 (03/17 11:52)
hubert100:是呀我知道會有buffer每個a好像就是在child才印= = 03/17 12:01
hubert100:原本想說這4個process會互相換所以會不會有類似abaaba 03/17 12:07
james732:每個 process 印的都是 "ab" 怎麼互換結果都一樣的 03/17 12:10
hubert100:我就覺得我錯很大 懂了 謝謝原po 03/17 12:12
cutecpu:推! 03/17 12:45
VictorTom:有個小問題, stderr只是另一個資料流(2號資料流嗎XD), 03/17 12:53
VictorTom:如果都用stderr輸出為什麼可以回避這個問題?? 還是 03/17 12:54
VictorTom:fprintf有對stderr做always flush之類的處理嗎?_? 03/17 12:54
DBoyX:stderr 沒有 buffer, 有什麼就印什麼 03/17 13:53
DBoyX:stdout 是行 buffer,看到 \n 或程式結束才會印 03/17 13:53
VictorTom:請問樓上, 哪裡有提到這一點?? 小弟我在下面查的結果, 03/17 14:04
VictorTom:http://ppt.cc/(_gq http://ppt.cc/@L0w 這兩點看起來 03/17 14:04
VictorTom:stdout與stderr都只是stdio.h裡定義的不同資料流而已, 03/17 14:05
VictorTom:目前還找不到stderr的buffering不同的說明, 願聞其詳orz 03/17 14:07
james732:我的印象跟 DBoyX 一樣,不過我忘了在哪裡看到的.... 03/17 14:25
VictorTom:小弟Google stderr與buffering有查到這個網站.... 03/17 14:40
VictorTom:http://ppt.cc/yzaU 有提到stderr是unbuffered.... 03/17 14:41
VictorTom:http://ppt.cc/!_z6 這裡的說明卻說stdout也unbuffered 03/17 14:43
VictorTom:現在有點亂了, 總之以後fflush()要準備好就是了....XD 03/17 14:45
ledia:不知道是否有明文規定, 我看到的 source 是只有 stderr 是 03/17 15:57
ledia:unbuffered 的, stdout 則沒有這樣的性質 03/17 15:57
VictorTom:Google到許多看起來出處相同的Linux/Unix man資料也都是 03/17 16:05
VictorTom:stdout為line buffered, 的確剩下只能看spec了....:) 03/17 16:06
DBoyX:VT: 你貼得那個 setbuf... 會不會是因為它第一行 03/18 07:33
DBoyX:說 IO operation buffer.. 而非 output buffer 的關係 03/18 07:33