參考一下這個:
http://blogold.chinaunix.net/u3/111072/showart_2298170.html
printk是核心態資訊列印函數,功能和比准C庫的printf類似。
printk還有資訊列印層級。
函數原型:
int printk(const char *fmt, ... |
需要的標頭檔:
訊息列印層級:
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()
將資訊輸出到
控制台而不是只是添加到記錄檔中。
當你編寫真正的實用的模組時,你應該針對可能遇到的情況使用合
適的優先順序。