printk和printf的區別

內核使用printk()打印!
應用層使用printf()打印!

&&& 大部分經常使用的C庫函數在Linux內核中都已經獲得了實現。在全部沒有實現的函數中,最著名的就數printf()函數了。內核代碼雖然沒法調用  printf()函數,但它能夠調用printk()函數。printk()函數負責把格式化好的字符串拷貝到內核日誌緩衝上,這樣syslog程序就可  以經過讀取該緩衝區來獲取內核信息。printk()的用法很像printf(): & printk("Hello world!A  string:%s and an integer:%d\n",a_string,an_integer); & printk()和printf()之間的一個顯著區別在於printk()容許經過指定一個標誌來設置優先級。syslog會根據這個優先級標  志來決定在什麼地方顯示這條系統信息。下面是一個使用這種優先級標誌的例子: & printk(KERN_ERR "this is an  error!\n");html

&&&&& printk()函數是直接使用了向終端寫函數tty_write()。而printf()函數是調用write()系統調用函數向標準輸出設備寫。因此  在用戶態(如進程0)不可以直接使用printk()函數,而在內核態因爲他已經是特權級,因此無需系統調用來改變特權級,於是可以直接使用  printk()函數。linux

printf是咋使用了標準的C庫函數的時候才能使用的,而內核中沒法使用標準的C庫函數,因此就連最多見的printf都不能使用。函數

    例如子printk函數的字符串參數中使用了KERN_ALERT,它實際上擴展爲字符串:「<1>」,而這部分信息沒有輸出到終端。實際上,這部分是內核信息的日誌級別,只有超過了當前日誌級別的信息纔會輸出到終端。當前內核的日誌級別能夠在/proc/sys/kernel/printk文件中看到。這個文件包含了四個整數,其中前兩個是控制檯的當前日誌級別和默認日誌級別。咱們在printk的參數中使用較高的日誌級別就是要保證信息獲得輸出。在<linux/kernel.h>頭文件裏一共定義了8個級別(0-7)的輸出,從高到低分別由以下常量表示:性能

KERN_EMERG         :    最高級別,通常只用來打印崩潰信息ui

KERN_ALERT         :    須要當即處理的信息this

KERN_CRIT          :    關鍵信息,通常用來顯示嚴重的硬件和軟件錯誤spa

KERN_ERR           :    用來顯示硬件錯誤.net

KERN_WARNING       :    顯示不會形成嚴重錯誤的警告信息unix

KERN_NOTICE        :    顯示須要引發注意的信息調試

KERN_INFO          :  顯示通常信息,例如驅動所發現的硬件列表

KERN_DEBUG    :  用來顯示調試信息

 

    printk與printf的一個區別printk是「行驅動」的,也就是說只有收到一個換行符數據纔會真正輸出到終端,不然就不會有任何信息輸出。另外一個值得注意的問題是咱們在調試嵌入式設備的時候,常常是從串口得到顯示信息,若是咱們使用printk過於頻繁的話,串口的傳輸速度就會成爲瓶頸,這樣會形成系統的性能降低甚至中止反應。

via:http://blog.chinaunix.net/uid-25749806-id-461471.html

相關文章
相關標籤/搜索