從一個小例子理解stdio 和 sysio

系統環境 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: 響應及時性

至於哪個效率?不能一概而論。應該從各自的特點上出發進行抉擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章