如何在linux程式中使用printk

2021-07-23 00:14:33 字數 2895 閱讀 9384

from:

要將linux核心的帶級別控制的printk內容列印出來,在命令列 輸入 dmesg -n 8 就將所有級別的資訊都列印出來

linux命令:dmesg  功能說明:顯示開機資訊。

語 法:dmesg [-cn][-s 《緩衝區大小》]

補充說明:kernel會將開機資訊儲存在ring buffer中。您若是開機時來不及檢視資訊,可利用dmesg來檢視。開機資訊亦儲存在/var/log目錄中,名稱為dmesg的檔案裡。

參 數:

-c 顯示資訊後,清除ring buffer中的內容。

-s《緩衝區大小》 預設定為8196,剛好等於ring buffer的大小。

-n 設定記錄資訊的層級。

printk() 使用說明

核心通過 printk() 輸出的資訊具有日誌級別,日誌級別是通過在 printk() 輸出的字串前加乙個帶尖括號的整數來控制的,如 printk(「<6>hello, world!/n」);。核心中共提供了八種不同的日誌級別,在 linux/kernel.h 中有相應的巨集對應。

#define kern_emerg            "<0>"

/* action must be taken immediately */

#define kern_alert "<1>"

/* action must be taken immediately */

#define kern_crit "<2>"

/* critical conditions */

#define kern_err "<3>"

/* error conditions */

#define kern_warning "<4>"

/* warning conditions */

#define kern_notice "<5>"

/* normal but significant */

#define kern_info "<6>"

/* informational */

#define kern_debug "<7>"

/* debug-level messages */

#define kern_emerg "<0>"

/* system is unusable */

#define kern_alert "<1>"

/* action must be taken immediately */

#define kern_crit "<2>"

/* critical conditions */

#define kern_err "<3>"

/* error conditions */

#define kern_warning "<4>"

/* warning conditions */

#define kern_notice "<5>"

/* normal but significant */

#define kern_info "<6>"

/* informational */

#define kern_debug "<7>"

/* debug-level messages */

所以 printk() 可以這樣用:printk(kern_info "hello, world!/n");

未指定日誌級別的 printk() 採用的預設級別是 default_message_loglevel,這個巨集在 kernel/printk.c 中被定義為整數 4,即對應kern_warning。

在 /proc/sys/kernel/printk 會顯示4個數值(可由 echo 修改),分別表示當前控制台日誌級別、未明確指定日誌級別的預設訊息日誌級別、最小(最高)允許設定的控制台日誌級別、引導時預設的日誌級別。當 printk() 中的訊息日誌級別小於當前控制台日誌級別時,printk 的資訊(要有/n符)就會在控制台上顯示。但無論當前控制台日誌級別是何值,通過 /proc/kmsg (或使用dmesg)總能檢視。另外如果配置好並執行了 syslogd 或 klogd,沒有在控制台上顯示的 printk 的資訊也會追加到 /var/log/messages.log 中。

通過讀寫/proc/sys/kernel/printk檔案可讀取和修改控制台的日誌級別。檢視這個檔案的方法如下:

#cat /proc/sys/kernel/printk 6 4 1 7

上面顯示的4個資料分別對應控制台日誌級別、預設的訊息日誌級別、最低的控制台日誌級別和預設的控制台日誌級別。

可用下面的命令設定當前日誌級別:

# echo 8 > /proc/sys/kernel/printk
另外為了防止 printk() 瞬時被呼叫次數過多,可以通過printk_ratelimit()來控制速度。printk_ratelimit()通過跟蹤傳送到控制台的訊息數量工作,當輸出速度超過乙個臨界值,就返回零。可通過修改 /proc/sys/kernel/ 來調節 printk_ratelimit() 的計算。

printk_ratelimit() 的典型用法如下:

if (printk_ratelimit())

printk(kern_info "hello, world!/n");

如何在Linux中使用awk命令

文字處理是unix的核心。從管道到 proc子系統,一切都是檔案 的理念貫穿於作業系統和所有基於它構造的工具。正因為如此,輕鬆地處理文字是乙個期望成為linux系統管理員甚至是資深使用者的最重要的技能之一,而 awk是通用程式語言之外最強大的文字處理工具之一。最簡單的awk的任務是從標準輸入中選擇字...

Linux 如何在Gaim中使用Gtalk

google talk使用了jabber協議,因此linuxfans可以很輕鬆地使用google的服務,設定如下 登入選項 協議 jabber 使用者名稱 gmail郵箱字首 伺服器 gmail.com 資源 google talk 密碼 gmail郵箱密碼 顯示主要選項 jabber選項 選中 若...

Linux 如何在Gaim中使用Gtalk

google talk使用了jabber協議,因此linuxfans可以很輕鬆地使用google的服務,設定如下 登入選項 協議 jabber 使用者名稱 gmail郵箱字首 伺服器 gmail.com 資源 google talk 密碼 gmail郵箱密碼 顯示主要選項 jabber選項 選中 若...