printk是核心態資訊列印函數,功能和比准C庫的printf類似。
printk還有資訊列印層級。
函數原型:
int printk(const char *fmt, ...) |
需要的標頭檔:
訊息列印層級:
fmt----訊息層級:
#defineKERN_EMERG "<0>" #defineKERN_ALERT "<1>" #defineKERN_CRIT "<2>" #defineKERN_ERR "<3>" #define KERN_WARNING "<4>" #defineKERN_NOTICE "<5>" #defineKERN_INFO "<6>" #defineKERN_DEBUG "<7>" |
不同層級使用不同字串表示,數字越小,層級越高。
printk輸出跟輸出的記錄層級有關係,當輸出記錄層級比控制台的層級高時,就會顯示在控制台上,當比控制台低時,則會記錄在/var/log/message中.但是當系統同時運行了klogd和syslogd時,都追加到/var/log/message.在/proc/sys/kernel/printk檔案中,前兩個整數為當前的記錄層級和預設的記錄層級(預設的記錄層級即為printk的輸出層級).
注意:
需要開啟klogd和syslogd服務才能正常輸出。通過klogd可以改變系統訊息輸出層級。
linux0.11為什麼在核心態使用printk()函數,而在使用者態使用printf()函數?
(1) 答:printk()函數是直接使用了向終端寫函數tty_write()。而printf()函數是調用write()系統調用函數向標準輸出裝置寫。所以在使用者態(如進程0)不能夠直接使用printk()函數,而在核心態由於他已是特權級,所以無需系統調用來改變特權級,因而能夠直接使用printk()函數。
printk是核心輸出,在終端是看不見的。
你可以看一下系統日誌。/var/log/message。
或者使用dmesg命令看一下
不管你可能怎麼想,printk()並不是設計用來同使用者互動的,雖然我們在hello-1就是出於這樣的目的使用它!它實際上是為核心提供日誌功能,記錄核心資訊或用來給出警告。因此,每個printk()聲明都會帶一個優先順序,就像你看到的<1>和KERN_ALERT
那樣。核心總共定義了八個優先順序的宏, 所以你不必使用晦澀的數字代碼,並且你可以從檔案 linux/kernel.h查看這些宏和它們的意義。如果你不指明優先順序,預設的優先順序DEFAULT_MESSAGE_LOGLEVEL將被採用。
閱讀一下這些優先順序的宏。標頭檔同時也描述了每個優先順序的意義。在實際中, 使用宏而不要使用數字,就像<4>。總是使用宏,就像KERN_WARNING。
當優先順序低於intconsole_loglevel,資訊將直接列印在你的終端上。如果同時syslogd和klogd都在運行,資訊也同時添加在檔案/var/log/messages,而不管是否顯示在控制台上與否。我們使用像KERN_ALERT這樣的高優先順序,來確保printk()將資訊輸出到控制台而不是只是添加到記錄檔中。
當你編寫真正的實用的模組時,你應該針對可能遇到的情況使用合 適的優先順序。