C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) Linux 3.16.0-4-586 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC -- 在敘述問題前,我想先說下到目前為止,我對檔案I/O方面理解到的一點東西。 理解不深,若有誤希望大家可以指正我,或給我一點線索,謝謝T_T。 以下的理解是建立在linux環境之下。 -- 一、 C語言的文件讀寫函式,像是fgets, fread, fputc...等,是透過一個 FILE *類型的參數來操作,而最終這些函式會呼叫諸如read或write之類 的system call,完成文件讀寫。 二、 一個程式被load進記憶體時,內核會有一個PCB來記錄這個程式的 相關資訊,其中也會記錄這個程式所開啟的文件。代表著這些文件的是一些 整數,read或write也是用這些整數來當作參數,對相應的文件進行處理。 一個程式一開始會開啟三個文件,分別是stdin,stdout和stderr,對應 的整數分別是0,1,2。 FILE結構內_fileno的值其實就是這個整數的值。 三、 system call的I/O是 "unbuffered I/O"。 C函式庫的I/O是 "buffered I/O"。 假設我有支C如下 #include <stdio.h> int main(void) { char str[20] = "Hello A.txt\n"; FILE *fpA = fopen("A.txt", "w"); fputs(str, fpA); fclose(fpA); return 0; } 因為我調用了C函式fopen,所以C會幫我管理一塊專屬於A.txt的buffer, 關於buffer的資訊會記在fpA所指的FILE結構中。 buffer位於這支程式的記憶體空間內,在user space裡。 fputs的作用就是把str寫到這個user space的buffer中。 也就是說,其實執行完fputs時,str還沒真正被寫入A.txt,只在buffer而已。 (這是C的buffered I/O) 在kernel space裡,也有一個A.txt的buffer。 write的作用就是把user space的buffer資料寫到kernel space的buffer裡, 之後再寫回A.txt中。 (這是system call的unbuffered I/O,但我不知道為什麼叫unbuffered) 四、 如果資料被放在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 -- 以上是目前為止我對文件I/O的理解。 如果有錯希望大家可以教我一下,因為下面我要問的問題是建立在這 之上,結果搞不好其實我上面就錯的一蹋糊塗了。 -- 一、 上面說到,因為我調用了C函式來操作I/O,所以C會幫我管理一個user space 的buffer,那麼,當我不用C標準函式庫,而直接使用system call來處理 文件的話,是不是就沒有那個 user space buffer了? 還有,那kernel space的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嗎? 讀寫的時候不會衝突嗎? 三、 當一個程式呼叫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 結束後,也應該會清空緩衝區才對,我整個黑人問號,希望大家可以跟我解釋一下 這個現象,謝謝。 -- 以下是我參考的資料,問題也是閱讀這些資料時蹦出來的。 http://docs.huihoo.com/c/linux-c-programming/ch28s04.html http://blog.csdn.net/astrotycoon/article/details/44993197 問題有點多,如果有那裡覺得表達不清楚請跟我說下,我會再做補充。 總之感激不盡,謝謝大家T_T。 -- --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.93.120
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1495915530.A.B3A.html
1F:→ tinlans: 把 APUE 拿來讀一遍就行了 06/05 03:36
2F:推 galic: 補充一下,C的三個i/o stream和各自的buffer行為 規格書是 06/06 04:16
3F:→ galic: 有訂的 06/06 04:16
4F:→ galic: 然後你說得kernel buffer…建議先理解unix-like對於file的 06/06 04:16
5F:→ galic: 概念不是這麼單純 像是block和character device的定義等等 06/06 04:16







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