2013-10-05 37 views
1

我想知道所有這些輸出函數,基本上他們做什麼? 因爲我經歷過很多次printf並不總是在屏幕上打印它遇到的時間,我聽說它放入緩衝區或類似的東西。因此,如果有人能夠清楚地知道發生了什麼。 如果還可以給出有關輸入函數的相同信息,那就太好了。 您告訴它的內容越深入,它將會非常有幫助。 。 謝謝。printf或任何輸出函數實際上做了什麼?

回答

0

printf的

寫入由格式指向的標準輸出(stdout)的C字符串。 如果格式包含格式說明符(以%開頭的子序列), 格式化後的其他參數將被格式化,並在生成的字符串中插入 替換其各自的說明符。

這已經很好地在這裏解釋瞭如何printf實際工作:

  1. 你的軟件調用printf()。

  2. 的printf()處理您的字符串,和args,然後需要執行 內核函數,如寫入文件不能在環做3.

  3. printf()的生成軟件中斷,將一個內核函數的編號(在這種情況下爲write()函數)置於一個寄存器中。

  4. 軟件執行中斷,指令指針 移動到內核代碼。所以我們現在在ring 0中,在一個內核 函數中。
  5. 內核處理請求,寫入文件(stdout是一個 文件描述符)。

  6. 完成後,內核使用iret 指令返回軟件代碼。

  7. 該軟件的代碼繼續。

ISO C99部一些有用的線7.19.3/3

當流是緩衝,字符旨在儘快從 源或目的地出現。否則, 字符可能被累積並作爲一個塊傳輸到主機或從主機 環境中傳輸。

當一個流被完全緩衝時,當填充緩衝區 時,字符將打算作爲一個塊向/從主機環境發送或從主機環境發送。

當一個流被行緩衝時,當遇到一個換行符 字符時,字符被設置爲 作爲一個塊傳送到主機環境或從主機環境傳出。

此外,字符被打算作爲塊 主機環境時的緩衝器被填滿時,當輸入請求 上的無緩衝流,或當請求上的線路輸入緩衝 流將被髮送的是需要從主機 環境傳輸字符。

對這些特徵的支持是實現定義的,並且可能會通過setbuf和setvbuf函數影響 。

+0

謝謝但它沒有解釋緩衝部分。爲什麼有時它不會打印,除非遇到'\ n' –

+0

@RahulBhojwani: - 標準輸出流被緩衝,所以只會在到達換行符後顯示緩衝區中的內容 –

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'); 
} 
相關問題