C_and_CPP 板


LINE

: 四、 : : 如果資料被放在space buffer中且沒有做flush的動作,那資料就不會 : 被寫到文件裡。 : 例如這個C程式就會印不出字串 : : #include <stdio.h> : : int main(void) : { : printf("Hello world"); //不會顯示在終端上 : while (1); : return 0; : } : : 下面幾種行為會導致buffer flush : 1、呼叫fflush : 2、fclose : 3、exit buffered IO最終還是有一個flush時機 這邊一般來說會是 line buffered IO 所以上面如果加了\n就會印出來 : : 一、 : : 上面說到,因為我調用了C函式來操作I/O,所以C會幫我管理一個user space : 的buffer,那麼,當我不用C標準函式庫,而直接使用system call來處理 : 文件的話,是不是就沒有那個 user space buffer了? : 還有,那kernel space的buffer依然存在嗎? 的確直接呼叫syscall就不會有user space buffer這件事 kernel space有沒有就看內部實作了 小弟才學疏淺 不過一個檔案也有可能是socket pipe disk 應該還是需要一塊buffer來做處理 : : 例如這樣 : : #include <unistd.h> : #include <sys/types.h> : #include <sys/stat.h> : #include <fcntl.h> : #include <string.h> : : int main(void) : { : char str[20] = "Hello A.txt\n"; : int fdA = open("A.txt", O_WRONLY|O_CREAT, 0666); : write(fdA, str, strlen(str)); : close(fdA); : return 0; : } : : : : 二、 : : 一個程式開始前會先開啟stdin、stdout和stderr三個文件,那很多個程式 : : 同時執行時,kernel space buffer是怎麼運作的? : : 例如有三個process,p1開啟這三個文件,p2、p3亦然,他們的user space各有 : : 這三個文件的buffer,但是在kernel space中呢?也是各有三個buffer嗎? : : 讀寫的時候不會衝突嗎? 在UNIX裡有個東西叫controlling terminal (ctty) 可以想像成是登入後直接與你互動的終端 它才是真正stdin和stdout的對象 多個程式同時執行時 其實stdin stdout都指向了同一個ctty 也就是說p1, p2, p3的stdin都是同一個file 補充: fd是可以讓不同process共用的 https://swtch.com/plan9port/man/man3/sendfd.html 但只有foreground process被允許對該ctty進行操作 而background process想要讀取寫入的話 會收到SIGTTIN/SIGTTOU訊號 https://i.imgur.com/RNiMTv5.png
: 三、 : : 當一個程式呼叫exit結束時,會關閉文件流並且flush user space的緩衝區, : : 請問kernel space的緩衝區會跟著被清空嗎? : : : : 四、 : : 以下程式碼 : : #include <unistd.h> : #include <stdlib.h> : : int main(void) : { : char buf[10]; : int n; : n = read(STDIN_FILENO, buf, 10); : if (n < 0) { : perror("read STDIN_FILENO"); : exit(1); : } : write(STDOUT_FILENO, buf, n); : return 0; : } : : : 編譯成a.out並執行,結果是這樣 : : $ ./a.out : hello world : hello worl$ d : -bash: d: command not found : : 我能理解當我輸入hello world時,緩衝區內會有11個字元,而這支a.out只讀了 : : 10個,所以緩衝區會剩一個d,但我不明白的是,為什麼a.out結束,返回shell後 : : shell還會讀到這個d,shell 和 a.out的緩衝區應該是分開的不是嗎? 而且a.out : : 結束後,也應該會清空緩衝區才對,我整個黑人問號,希望大家可以跟我解釋一下 : : 這個現象,謝謝。 : 呈上所述的檔案共享與controlling terminal概念 我們假設該ctty叫 /dev/pts9 原本控制/dev/pts9的process是bash 得到輸入./a.out後執行該程式 並把控制權轉交給a.out 補充: bash會呼叫tcsetgrp https://linux.die.net/man/3/tcsetpgrp 接下來我們輸入了"hello world\n"到 /dev/pts9中 (即a.out的stdin) a.out取出了10個字元 留下"d\n"在/dev/pts9中 return 0; 終止程式後 控制權交還給bash 而bash當然是繼續讀取指令 就會讀到/dev/pts9裡面的"d\n" 並嘗試執行"d" 似乎還是沒有很好的解釋出為何緩衝區沒有被清空 (或者說為何需要被清空?) 但事實上 bash跟a.out的確是使用同一個ctty (也可以說是緩衝區..) : : : : -- : : 以下是我參考的資料,問題也是閱讀這些資料時蹦出來的。 : : http://docs.huihoo.com/c/linux-c-programming/ch28s04.html : : http://blog.csdn.net/astrotycoon/article/details/44993197 這篇文章有提及蠻多關於IO的東西了 可以在理解process groups和controlling terminal後 (甚至連fork和exec那塊) 再回去看一次 補充一個這方面的連結 https://hungys.xyz/unix-prog-process-relationships/ : : : 問題有點多,如果有那裡覺得表達不清楚請跟我說下,我會再做補充。 : : 總之感激不盡,謝謝大家T_T。 : --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.46.93.105
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1495968477.A.A78.html ※ 編輯: x000032001 (114.46.93.105), 05/28/2017 19:10:05
1F:推 hth9494: 感謝回答,我要消化一下_(:з」∠)_ 05/28 19:44







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP