我想知道所有這些輸出函數,基本上他們做什麼? 因爲我經歷過很多次printf並不總是在屏幕上打印它遇到的時間,我聽說它放入緩衝區或類似的東西。因此,如果有人能夠清楚地知道發生了什麼。 如果還可以給出有關輸入函數的相同信息,那就太好了。 您告訴它的內容越深入,它將會非常有幫助。 。 謝謝。printf或任何輸出函數實際上做了什麼?
1
A
回答
0
printf的
寫入由格式指向的標準輸出(stdout)的C字符串。 如果格式包含格式說明符(以%開頭的子序列), 格式化後的其他參數將被格式化,並在生成的字符串中插入 替換其各自的說明符。
這已經很好地在這裏解釋瞭如何printf實際工作:
你的軟件調用printf()。
的printf()處理您的字符串,和args,然後需要執行 內核函數,如寫入文件不能在環做3.
printf()的生成軟件中斷,將一個內核函數的編號(在這種情況下爲write()函數)置於一個寄存器中。
- 軟件執行中斷,指令指針 移動到內核代碼。所以我們現在在ring 0中,在一個內核 函數中。
內核處理請求,寫入文件(stdout是一個 文件描述符)。
完成後,內核使用iret 指令返回軟件代碼。
該軟件的代碼繼續。
從ISO C99部一些有用的線7.19.3/3
當流是緩衝,字符旨在儘快從 源或目的地出現。否則, 字符可能被累積並作爲一個塊傳輸到主機或從主機 環境中傳輸。
當一個流被完全緩衝時,當填充緩衝區 時,字符將打算作爲一個塊向/從主機環境發送或從主機環境發送。
當一個流被行緩衝時,當遇到一個換行符 字符時,字符被設置爲 作爲一個塊傳送到主機環境或從主機環境傳出。
此外,字符被打算作爲塊 主機環境時的緩衝器被填滿時,當輸入請求 上的無緩衝流,或當請求上的線路輸入緩衝 流將被髮送的是需要從主機 環境傳輸字符。
對這些特徵的支持是實現定義的,並且可能會通過setbuf和setvbuf函數影響 。
1
大部分時間的printf做這樣的事情:爲%S標誌(無緩衝,以及其他的小東西)
:
void my_putchar(char c)
{
write(1, &c, 1);
}
int my_putstr(char *str) // printf("%s", "hello");
{
int i;
i = 0;
while (str[i] != '\0')
{
my_putchar(str[i]);
i = i + 1;
}
}
併爲%d標誌
void my_put_nbr(int nb) // printf("%d", 100);
{
if (nb > 9)
my_put_nbr(nb/10);
my_putchar(nb % 10 + '0');
}
相關問題
- 1. 內聯函數實際上做了什麼?
- 2. 複製構造函數實際上做了什麼?
- 3. 函數'vDSP_vfltu16'(在vDSP中)實際上做了什麼?
- 4. ATL的CAccessToken的析構函數實際上做了什麼?
- 5. gwt PlaceTokenizer實際上做了什麼?
- 6. Arduino F():它實際上做了什麼
- 7. numpy.cov實際上做了什麼
- 8. ADMManifest.checkManifestAuthoredProperly()實際上做了什麼?
- 9. LD_INCLUDE_PATH實際上做了什麼嗎?
- 10. android:stretchMode實際上做了什麼?
- 11. CascadeType.REFRESH實際上做了什麼?
- 12. session_register_shutdown實際上做了什麼?
- 13. CloudQueue.EndAddMessage(IAsyncResult)實際上做了什麼?
- 14. Int [] Reverse - 這實際上做了什麼?
- 15. e.preventDefault()方法實際上做了什麼?
- 16. Python的__file__實際上做了什麼?
- 17. std :: ofstream :: close()實際上做了什麼?
- 18. XCode'Clean'實際上做了什麼?
- 19. 實際上做了什麼glutswapbuffers?
- 20. Sinatra :: Base.condition實際上做了什麼?
- 21. NSLog實際上做了什麼?
- 22. SetPriorityClass(REALTIME_PRIORITY_CLASS)實際上做了什麼?
- 23. TwoPassFilter GPUImage實際上做了什麼?
- 24. terraform刷新實際上做了什麼?
- 25. SpringClassRule/SpringMethodRule實際上做了什麼?
- 26. IMetadataExchange端點實際上做了什麼?
- 27. Android SQLite - SQLiteDatabase.replace()實際上做了什麼?
- 28. MvcBuildViews實際上做了什麼嗎?
- 29. pdb文件實際上做了什麼?
- 30. regsvr32 filename.ax實際上做了什麼?
謝謝但它沒有解釋緩衝部分。爲什麼有時它不會打印,除非遇到'\ n' –
@RahulBhojwani: - 標準輸出流被緩衝,所以只會在到達換行符後顯示緩衝區中的內容 –