printf 等系統庫函式是如何實現的?

時間 2021-05-11 17:26:56

1樓:張想

windows上有個標準裝置,std,printf在根源上是,通過windows API GetStdHandle 來得到這個裝置,然後通過WriteFile API來寫這個裝置。。。printf也好,putchar 也好,他只是向乙個stdout緩衝區來寫資料(這是裝置系統無關的),這是C語言做的事。。。真正達到傳送條件是,他是呼叫WriteFile來將stdout傳送出去,這才是裝置系統有關的,WriteFile函式是系統的,到其他環境上比如linux 會變成write,甚至到微控制器上是while(ch) UARTA=*(ch++);這樣。。。

裝置無關的函式可以不變。。。

還有系統系統 API是怎麼呼叫的,拿linux來說,linux我其實不是很熟,API都是在系統中已經完成的函式,當你呼叫API,他的第一步是發出CPU軟中斷和中斷號,每個API會對應乙個軟中斷,軟中斷後CPU經過一系列處理最終會進入系統模式,並通過中斷號去查向量表,找到函式指標的位置,然後呼叫,系統這些核心API並不能算是個函式庫,他一開始就跟隨系統裝到記憶體裡了。。。

2樓:

軟體上最根本的是向視訊記憶體位址寫資料螢幕就顯示出字元了,進行這個操作的是作業系統核心,printf函式呼叫system call讓核心把資料寫到視訊記憶體。

3樓:啊魚

整個gcc都是開源的,所以printf之類的庫函式可以在gcc原始碼裡找,

更底層的system call,整個Linux都是開源的,看原始碼看原始碼,

至於Windows,只能看看MSDN了,

4樓:yang leonier

vs裡面有windows下msvcrt的原始碼,可以稍微參考最後肯定要用console系列的api 最後要跑到csrss裡什麼的

5樓:鍾宇騰

如果是在 UNIX 下,printf 實際上最後呼叫的就是 write 這個 syscall 。它就是往 stdout 這個檔案裡面寫你要寫的那些東西,當然了,首先要把那些引數都格式化成乙個字串。

6樓:叔本華.com

#include

static void *prout(void *str,const char *buf,size_t n)

int (printf)(const char *fmt,...)int _printf(void *(*pfn)(void *,const char *,size_t),void *arg, const char *fmt,va_list ap);

pfn為函式指標,用來傳送字元

arg是通用資料物件指標

fmt是指向格式串的指標

ap指向上下文資訊

arg用來判斷是否發生寫錯誤

引用自《C標準庫》,有些東西我還不是很清楚,正在研究當中

7樓:高歌

《C標準庫》。

gcc編譯器套件是開源的,你也可以直接在它的標準庫原始碼裡找。

linux中c庫函式和系統呼叫的區別是什麼呢?

徐聖 簡單的說c庫函式是為了方便使用者程式設計以及使用OS,對系統呼叫的封裝和擴充套件。封裝體現在使用系統功能介面更友好,更方便。直接調系統呼叫API,你會發現引數較多,各種返回異常需要自己處理。C庫一定程度上幫你做了這個工作。擴充套件體現在系統呼叫沒有的功能,c庫幫你擴充了。比如string庫很多...

如何不用庫函式用C 實現RSA檔案加密?

步驟 實現大數庫 實現大數四則運算 使用Montgomery實現模乘模冪 藉由上述基礎完成Miller Rabin素數測試然後就是簡單的函式呼叫進行c d N之類的操作了 柳傾 本科畢業設計寫過RSA 加密。需要額外的庫最根本的原因是需要 大數庫 因為RSA 加解密資料塊長度超過常用型別 int,s...

Linux 中如何快速檢視 C 庫函式的標頭檔案以及相應的函式資訊?

蒲公英 自從看了 Unix Linux程式設計實踐教程 五星推薦這本書 檢視標頭檔案和函式資訊非常方便。man k keyword grep name 查詢乙個man手冊中的簡短說明包含keyword的函式,name為函式名的關鍵字 可以不加管道 如man k timer grep set 查詢乙個...