- 論壇徽章:
- 0
|
通過printk打你希望追蹤的消息。從它的名字可以看出,這個東西有點類似與gnu
c中的printf。不過用于內(nèi)核的東西總該有些特色,printk添加了一些日志級別(loglevel),具體日志級別定義的宏在。
(printk的格式:printk(KERN_ALERT"The process is \"%s\"(pid
%i)\n",current->comm,current->pid)) 。
這些宏定義的注釋已經(jīng)很詳細(xì)了。
#define KERN_EMERG "" /* system is
unusable */
#define KERN_ALERT "" /* action must be taken
immediately */
#define KERN_CRIT "" /* critical
conditions */
#define KERN_ERR "" /* error
conditions */
#define KERN_WARNING "" /* warning
conditions */
#define KERN_NOTICE "" /* normal but significant
condition */
#define KERN_INFO "" /*
informational */
#define KERN_DEBUG "" /* debug-level
messages */
用printk,內(nèi)核會根據(jù)日志級別,可能把消息打印到當(dāng)前控制臺上,這個控制臺通常是一個字符模式的終端、一個串口打印機或是一個并口打印機。這些消息正常輸出的前提是──日志輸出級別小于console_loglevel(在內(nèi)核中數(shù)字越小優(yōu)先級越高)。但如果系統(tǒng)運行了klogd和
syslogd日志守護進(jìn)程,那么printk的信息將同時被追加到/var/log/messages中,當(dāng)然你也可以通過dmesg來查看系統(tǒng)的輸出信息(這些信息在/proc/kmsg,但它并沒有把消息映射到用戶空間,所以普通用戶無法直接訪問,而dmesg是用來訪問它的一個工具,內(nèi)核為了節(jié)省資源,把kmsg設(shè)計為一個循環(huán)緩存區(qū),在內(nèi)核中這種設(shè)計很常見)。
在內(nèi)核運行的情況下,我們可以通過proc文件系統(tǒng)來修改內(nèi)核運行的一些參數(shù)。proc其實它是一個內(nèi)存文件系統(tǒng),它展示了linux vfs(virtural
file
system)文件系統(tǒng)的威力。該文件系統(tǒng)由軟件創(chuàng)建,內(nèi)核使用它向外界導(dǎo)出信息,由于對proc的使用有些混亂,導(dǎo)致sys文件系統(tǒng)的出現(xiàn)。貌似跑題了!因proc文件系統(tǒng)是內(nèi)核拋出的信息,因此你可以通過修改/proc/sys/kernel/printk中的值來修改日志的輸出級別。該文件中包含了4個值,分別表示為:當(dāng)前的日志級別,未明確指定日志級別時的默認(rèn)消息級別,最小允許的日志級別和引導(dǎo)時的默認(rèn)日志級別。
為了更好的管理日志,你可通過修改/etc/syslog.conf來滿足你的需求。man
syslog.conf獲得更多關(guān)于syslog.conf的信息。當(dāng)你在編寫內(nèi)核模塊時,應(yīng)該注意一個問題,你不能讓那些消息困擾你,因此定義一些宏來開關(guān)printk消息是很有必要的,畢竟printk是用來調(diào)試,或者顯示設(shè)備、模塊的一些狀態(tài)。另外內(nèi)核同時也提供了一些接口,在中定義,他們是一些內(nèi)聯(lián)函數(shù)。int
printk_ratelimit(void)。在打印一條可能被重復(fù)的信息之前,應(yīng)調(diào)用該函數(shù)。如果它返回一個非零值,則可以繼續(xù)打印消息,否則跳過。
printk_ratelimit通過跟蹤發(fā)送到控制臺的消息量,開避免消息的重復(fù)輸出?梢酝ㄟ^修改/proc/sys/kernel
/printk_ratelimit來設(shè)置重新打開消息應(yīng)該等待的秒數(shù)。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/51980/showart_1670820.html |
|