回覆列表
-
1 # 髒話比謊話乾淨558
-
2 # 暖暖敲美麗
一、功能不同
1、print:將資訊顯示在命令視窗中,輸出游標定位在最後一個字元之後。
2、printf:將資訊進行格式化顯示在命令視窗中,輸出游標定位在最後一個字元之後。
二、語法不同
1、print:Print("\n ") = Println(" ")。
2、printf:System.out.println(" ")
大部分常用的C庫函式在Linux核心中都已經得到了實現。在所有沒有實現的函式中,最著名的就數printf()函數了。核心程式碼雖然無法呼叫
printf()函式,但它可以呼叫printk()函式。printk()函式負責把格式化好的字串複製到核心日誌緩衝上,這樣syslog程式就可
以透過讀取該緩衝區來獲取核心資訊。printk()的用法很像printf():
&
printk("Hello world!A
string:%s and an integer:%d\n",a_string,an_integer);
&
printk()和printf()之間的一個顯著區別在於printk()允許透過指定一個標誌來設定優先順序。syslog會根據這個優先順序標
志來決定在什麼地方顯示這條系統資訊。下面是一個使用這種優先順序標誌的例子:
&
printk(KERN_ERR "this is an
error!\n");
&&&&&
printk()函式是直接使用了向終端寫函式tty_write()。而printf()函式是呼叫write()系統呼叫函式向標準輸出裝置寫。所以
在使用者態(如程序0)不能夠直接使用printk()函式,而在核心態由於他已是特權級,所以無需系統呼叫來改變特權級,因而能夠直接使用
printk()函式。
printf是咋使用了標準的C庫函式的時候才能使用的,而核心中無法使用標準的C庫函式,所以就連最常見的printf都不能使用。
例如子printk函式的字串引數中使用了KERN_ALERT,它實際上擴充套件為字串:“<1>”,而這部分資訊沒有輸出到終端。實際上,這部分是核心資訊的日誌級別,只有超過了當前日誌級別的資訊才會輸出到終端。當前核心的日誌級別可以在/proc/sys/kernel/printk檔案中看到。這個檔案包含了四個整數,其中前兩個是控制檯的當前日誌級別和預設日誌級別。我們在printk的引數中使用較高的日誌級別就是要保證資訊得到輸出。在標頭檔案裡一共定義了8個級別(0-7)的輸出,從高到低分別由如下常量表示:
KERN_EMERG : 最高級別,一般只用來列印崩潰資訊
KERN_ALERT : 需要立即處理的資訊
KERN_CRIT : 關鍵資訊,一般用來顯示嚴重的硬體和軟體錯誤
KERN_ERR : 用來顯示硬體錯誤
KERN_WARNING : 顯示不會造成嚴重錯誤的警告資訊
KERN_NOTICE : 顯示需要引起注意的資訊
KERN_INFO : 顯示一般資訊,例如驅動所發現的硬體列表
KERN_DEBUG : 用來顯示除錯資訊
printk與printf的一個區別printk是“行驅動”的,也就是說只有收到一個換行符資料才會真正輸出到終端,否則就不會有任何資訊輸出。另一個值得注意的問題是我們在除錯嵌入式裝置的時候,經常是從串列埠獲得顯示資訊,如果我們使用printk過於頻繁的話,串列埠的傳輸速度就會成為瓶頸,這樣會造成系統的效能下降甚至停止反應。