作为一个码农,用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内核太牛叉了,连个分级日志都这么牛掰,不服不行!
扫描二维码关注公众号,回复:
4504041 查看本文章
今天又学了一招!