慢慢學Linux驅動開發,第三篇,關於printk的輸出總結

來源:互聯網
上載者:User

參考一下這個:

http://blogold.chinaunix.net/u3/111072/showart_2298170.html

 

printk是核心態資訊列印函數,功能和比准C庫的printf類似。

printk還有資訊列印層級。 

函數原型:

int printk(const char *fmt, ...

 

需要的標頭檔:

 

#include
<linux/kernel.h


訊息列印層級:
fmt----訊息層級:

#define
KERN_EMERG 
 
 
 

"<0>"
#define
KERN_ALERT 
 
 
 

"<1>"
#define
KERN_CRIT 
 
 
 
 

"<2>"
#define
KERN_ERR 
 
 
 
 
 

"<3>"
#define KERN_WARNING 
 

"<4>"
#define
KERN_NOTICE 
 
 

"<5>"
#define
KERN_INFO 
 
 
 
 

"<6>"
#define
KERN_DEBUG 
 
 
 

"<7>"

 

不同層級使用不同字串表示,數字越小,層級越高。
     
printk輸出跟輸出的記錄層級有關係,當輸出記錄層級比控制台的層級高時,就會顯示在控制台上,當比控制台低時,則會記錄在/var/log
/message中.但是當系統同時運行了klogd和syslogd時,都追加到/var/log/message.在/proc/sys
/kernel/printk檔案中,前兩個整數為當前的記錄層級和預設的記錄層級(預設的記錄層級即為printk的輸出層級)。

注意:

/proc/sys/kernel/printk
該檔案有四個數字值,它們根據日誌記錄訊息的重要性,定義將其發送到何處。關於不同記錄層級的更多資訊,請閱讀 syslog(2) 線上說明頁。該檔案的四個值為:
控制台記錄層級:優先順序高於該值的訊息將被列印至控制台
預設的訊息記錄層級:將用該優先順序來列印沒有優先順序的訊息
最低的控制台記錄層級:控制台記錄層級可被設定的最小值(最高優先順序)
預設的控制台記錄層級:控制台記錄層級的預設值

/proc/sys/kernel/printk
              The  four values in this file are console_loglevel, default_mes-
              sage_loglevel,    minimum_console_level     and     default_con-
              sole_loglevel.   These  values  influence printk() behavior when
              printing or logging error messages. See syslog(2) for more  info
              on  the  different  loglevels.   Messages with a higher priority
              than console_loglevel will be printed to the console.   Messages
              without  an  explicit  priority  will  be  printed with priority
              default_message_level.  minimum_console_loglevel is the  minimum
              (highest)   value   to   which   console_loglevel  can  be  set.
              default_console_loglevel  is  the   default   value   for   con-
              sole_loglevel.

預設設定:6 4 1 7

注意:
     
需要開啟klogd和syslogd服務才能正常輸出。通過klogd可以改變系統訊息輸出層級。


 
linux0.11為什麼在核心態使用printk()函數,而在使用者態使用printf()函數?

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

printk是核心輸出,在終端是看不見的。
你可以看一下系統日誌。/var/log/message
或者使用dmesg命令看一下。

使用Ctrl + Alt + T開啟的終端是無法顯示的,必須用Ctrl + Alt + F2—F6開啟的終端才可以顯示。

      

printk()


並不是設計用來同使用者互動的,雖然我們在
hello-1

就是出於這樣的目的使用它!它實際上是為核心提供日誌功能,

記錄核心資訊或用來給出警告。因此,每個

printk()



聲明都會帶一個優先順序,就像你看到的
<1>



KERN_ALERT


那樣。核心總共定義了八個優先順序的宏,

所以你不必使用晦澀的數字代碼,並且你可以從檔案

linux/kernel.h

查看這些宏和它們的意義。如果你

不指明優先順序,預設的優先順序
DEFAULT_MESSAGE_LOGLEVEL

將被採用。

     
閱讀一下這些優先順序的宏。標頭檔同時也描述了每個優先順序的意義。在實際中,

使用宏而不要使用數字,就像
<4>

。總是使用宏,就像
KERN_WARNING


    
當優先順序低於
int
console_loglevel

,資訊將直接列印在你的終端上。如果同時

syslogd



klogd

都在運行,資訊也同時添加在檔案
/var/log/messages
,而不管是否顯示在控制台上與否。我們使用像





KERN_ALERT



這樣的高優先順序,來確保
printk()

將資訊輸出到
控制台而不是只是添加到記錄檔中。

當你編寫真正的實用的模組時,你應該針對可能遇到的情況使用合
適的優先順序。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.