linux prink太了不起了!
阿新 • • 發佈:2018-12-14
作為一個碼農,用C語言也用了十幾年,現在在開發一個讀卡器模組,想做一個日誌分級輸出的機制。於是就想到了linux kernel中的printk,想參考參考
。發現printk的實現也沒啥,主要利用了可變引數機制。日誌分級輸出的實現在,vprintk中。
vprintk中分析了prinkt的第一個引數fmt, 對於日誌級別字串,如KERN_DEBUG進行了解析。按驥索圖,看看KERN_DEBUG的定義,如下:
#define KERN_DEBUG "<7>" /* debug-level messages */
所以如果使用者呼叫了語句,
printk(KERN_DEBUG"%d",10);的話會被替換成
printk("<7>" "%d",10);
注意紅色部分,兩個連續的字串會被編譯器連線在一起形成一個字串!我十分驚訝!對此,我又寫了一個測試程式,就是列印幾個字串,如下:
printf("Hello,China" "Happy New Year" "Oh,My God\r\n");
然後,終端輸出了“Hello,ChinaHappy New Yearoh,My God”。
linux核心太牛叉了,連個分級日誌都這麼牛掰,不服不行!
今天又學了一招!