linux之printk和printf的區別

2021-08-07 23:08:42 字數 1457 閱讀 2272

大部分常用的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");

printk()函式是直接使用了向終端寫函式tty_write()。而printf()函式是呼叫write()系統呼叫函式向標準輸出裝置寫。所以 在使用者態(如程序0)不能夠直接使用printk()函式,而在核心態由於他已是特權級,所以無需系統呼叫來改變特權級,因而能夠直接使用 printk()函式。

printf是使用了標準的c庫函式的時候才能使用的,而核心中無法使用標準的c庫函式,所以就連最常見的printf都不能使用。

例如子printk函式的字串引數中使用了kern_alert,它實際上擴充套件為字串:「<1>」,而這部分資訊沒有輸出到終端。實際上,這部分是核心資訊的日誌級別,只有超過了當前日誌級別的資訊才會輸出到終端。當前核心的日誌級別可以在/proc/sys/kernel/printk檔案中看到。這個檔案包含了四個整數,其中前兩個是控制台的當前日誌級別和預設日誌級別。我們在printk的引數中使用較高的日誌級別就是要保證資訊得到輸出。在標頭檔案裡一共定義了8個級別(0-7)的輸出,從高到低分別由如下常量表示:

kern_emerg         :    最高端別,一般只用來列印崩潰資訊

kern_alert         :    需要立即處理的資訊

kern_crit          :    關鍵資訊,一般用來顯示嚴重的硬體和軟體錯誤

kern_err           :    用來顯示硬體錯誤

kern_warning       :    顯示不會造成嚴重錯誤的警告資訊

kern_notice        :    顯示需要引起注意的資訊

kern_info          :  顯示一般資訊,例如驅動所發現的硬體列表

kern_debug    :  用來顯示除錯資訊

printk與printf的乙個區別printk是「行驅動」的,也就是說只有收到乙個換行符資料才會真正輸出到終端,否則就不會有任何資訊輸出。

另乙個值得注意的問題是我們在除錯嵌入式裝置的時候,經常是從串列埠獲得顯示資訊,如果我們使用printk過於頻繁的話,串列埠的傳輸速度就會成為瓶頸,這樣會造成系統的效能下降甚至停止反應。   

linux驅動除錯之printk

對於做嵌入式或者熟悉linux核心的人來說,對printk這個函式一定不會感到陌生。printk相當於printf的孿生姐妹,她們乙個執行在使用者態,另乙個則在核心態被人們所熟知。printk是在核心中執行的向控制台輸出顯示的函式,linux核心首先在核心空間分配乙個靜態緩衝區,作為顯示用的空間,然...

驅動除錯之printk

閱讀過linux核心原始碼的童鞋肯定知道,核心有很多呼叫printk函式列印的除錯資訊。但是在核心啟動的時候,這些除錯資訊是預設不會列印出來的,需要啟動之後呼叫dmesg命令才能檢視到核心的列印資訊,即便這樣,我們還是不能檢視到完整的核心列印資訊,這是為什麼呢?下面我們要引入printk的級別 1....

printk和printf的區別

大部分常用的c庫函式在linux核心中都已經得到了實現。在所有沒有實現的函式中,最著名的就數printf 函式了。核心 雖然無法呼叫 printf 函式,但它可以呼叫printk 函式。printk 函式負責把格式化好的字串拷貝到核心日誌緩衝上,這樣syslog程式就可 以通過讀取該緩衝區來獲取核心...