linux prink太了不起了!

本文探讨了如何在C语言中实现类似于Linux内核printk的日志分级输出机制。通过宏定义实现不同的日志级别,并利用编译器特性将多个字符串字面量自动连接为一个字符串,从而简化日志输出过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        作为一个码农,用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内核太牛叉了,连个分级日志都这么牛掰,不服不行!

     今天又学了一招!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值