消息打印級別:
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>"
不同級別使用不同字符串表示,,數(shù)字越小,級別越高,。
printk輸出跟輸出的日志級別有關(guān)系,當輸出日志級別比控制臺的級別高時,就會顯示在控制臺上,當比控制臺低時,則會記錄在/var/log/message中.但是當系統(tǒng)同時運行了klogd和syslogd時,都追加到/var/log/message.在/proc/sys/kernel/printk文件中,前兩個整數(shù)為當前的日志級別和默認的日志級別(默認的日志級別即為printk的輸出級別).
注意:
需要開啟klogd和syslogd服務(wù)才能正常輸出,。通過klogd可以改變系統(tǒng)消息輸出級別。
linux0.11為什么在內(nèi)核態(tài)使用printk()函數(shù),,而在用戶態(tài)使用printf()函數(shù),?
(1) 答:printk()函數(shù)是直接使用了向終端寫函數(shù)tty_write()。而printf()函數(shù)是調(diào)用write()系統(tǒng)調(diào)用函數(shù)向標準輸出設(shè)備寫,。所以在用戶態(tài)(如進程0)不能夠直接使用printk()函數(shù),,而在內(nèi)核態(tài)由于他已是特權(quán)級,所以無需系統(tǒng)調(diào)用來改變特權(quán)級,,因而能夠直接使用printk()函數(shù),。
printk是內(nèi)核輸出,在終端是看不見的,。
你可以看一下系統(tǒng)日志,。/var/log/message。
或者使用dmesg命令看一下
不管你可能怎么想,,printk()并不是設(shè)計用來同用戶交互的,,雖然我們在 hello-1就是出于這樣的目的使用它!它實際上是為內(nèi)核提供日志功能,, 記錄內(nèi)核信息或用來給出警告,。因此,每個printk() 聲明都會帶一個優(yōu)先級,,就像你看到的<1>和KERN_ALERT 那樣,。內(nèi)核總共定義了八個優(yōu)先級的宏, 所以你不必使用晦澀的數(shù)字代碼,,并且你可以從文件linux/kernel.h查看這些宏和它們的意義,。如果你 不指明優(yōu)先級,默認的優(yōu)先級DEFAULT_MESSAGE_LOGLEVEL將被采用,。
閱讀一下這些優(yōu)先級的宏,。頭文件同時也描述了每個優(yōu)先級的意義,。在實際中, 使用宏而不要使用數(shù)字,,就像<4>,。總是使用宏,,就像 KERN_WARNING,。
當優(yōu)先級低于int console_loglevel,信息將直接打印在你的終端上,。如果同時 syslogd和klogd都在運行,,信息也同時添加在文件 /var/log/messages,而不管是否顯示在控制臺上與否,。我們使用像 KERN_ALERT這樣的高優(yōu)先級,,來確保printk()將信息輸出到 控制臺而不是只是添加到日志文件中。 當你編寫真正的實用的模塊時,,你應(yīng)該針對可能遇到的情況使用合 適的優(yōu)先級,。