首頁>Club>
7
回覆列表
  • 1 # 髒話比謊話乾淨558

    大部分常用的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過於頻繁的話,串列埠的傳輸速度就會成為瓶頸,這樣會造成系統的效能下降甚至停止反應。

  • 2 # 暖暖敲美麗

    一、功能不同


    1、print:將資訊顯示在命令視窗中,輸出游標定位在最後一個字元之後。


    2、printf:將資訊進行格式化顯示在命令視窗中,輸出游標定位在最後一個字元之後。


    二、語法不同


    1、print:Print("\n ") = Println(" ")。


    2、printf:System.out.println(" ")

  • 中秋節和大豐收的關聯?
  • 大學畢業在家待業,母親重病花了很多錢,父親務農收入極少,村委會不同意給低保怎麼辦?