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 查詢乙個...