系統環境 ubuntu
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
putchar('a');
write(1,"b",1);
putchar('a');
write(1,"b",1);
putchar('a');
write(1,"b",1);
exit(0);
}
如上代碼執行結果可選項: ababab or aaabbb or bbbaaa ?
正確答案:bbbaaa 。
原因:
我們知道標準io不僅僅存在於UNIX中,在很多其他的操作系統中都實現了標準io庫,當然不同的操作系統標準io函數的實現是由各自系統的系統io函數封裝而成的。示意圖如下:
系統io 提供的函數常被稱爲不帶緩衝的io ,如 read write 函數 每執行一次就會調用內核中的一個調用,但是標準io則不同,它提供緩衝(行緩衝 全緩衝 不帶緩衝),之所以提供緩衝就是爲了減少使用read和write的調用次數,可以先將數據放置到緩衝區中然後統一執行read write 函數。
行緩衝:換行符(\n)、緩衝區已滿 、強制刷新(如fflush()函數)
全緩衝:緩衝區已滿 、強制刷新fflush()
write 系統調用 相交與標準io 調用速度更快。
putchar 就是行緩衝,所以在這種情況下肯定是將所有a字符都輸入到緩衝區中在集體輸出的。
我們可以使用strace 命令查看代碼的調用過程:
strace ./xxx
標準io 和 系統 io 哪個更加效率:
標準io : 暫時放置到緩衝區中,等到條件滿足統一調用系統方法。
系統io: 響應及時性
至於哪個效率?不能一概而論。應該從各自的特點上出發進行抉擇。