&&&

大部分常用的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过于频繁的话,串口的传输速度就会成为瓶颈,这样会造成系统的性能下降甚至停止反应。

c语言中printk用法,printk和printf的区别相关推荐

  1. Java语言中print、println和printf的区别

    前言 如果你是java的初学者,那相信你一定会有过疑惑,就是java中三大输出方式到底有什么区别.特别是先学过其他语言的,就更容易搞混.所以,小编就通过具体实例来详细缕一缕,帮助你理解记忆,消除疑惑. ...

  2. C语言中const用法详解

    C语言中const用法详解 const修饰普通变量 const作用在于定义一个常量,比如const int a = 10,代表a的值不能被直接修改了,是一个常量,但仍可以通过指针的方式间接修改,如下图 ...

  3. c语言for什么意思,C语言中for用法是什么?

    C语言中for用法是: for 循环语句的一般形式为:for (表达式1; 表达式2; 表达式3) { 语句; } 首先要强调两点: 1) 表达式1.表达式2和表达式3之间是用分号;隔开的,千万不要写 ...

  4. c语言中用了continue头文件,c语言中continue用法是什么?

    c语言中continue用法是什么? continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环. continue语句只用在 while.for 循环中,常与 if 条件语句一起使用, ...

  5. java 函数fun_c语言中fun用法详解_后端开发

    Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...

  6. c语言中funx的作用,c语言中fun用法详解

    C语言中fun用法详解 fun函数是自定义的C/C++语言函数,函数功能多样.该函数名为"函数"英文function的简写,一般在示例和试题中使用,通常在主函数中被调用. C/C+ ...

  7. Go语言中的fmt.Print, fmt.Printf, fmt.Println的区别和使用场景

    Go语言中的fmt.Print, fmt.Printf, fmt.Println的区别和使用场景 fmt 包的介绍 fmt.Print === 原样输出 fmt.Printf === 格式输出 fmt ...

  8. java if和else if的区别_关于C语言中if,elseif和else的区别在哪里

    关于C语言中if,elseif和else的区别在哪里以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 关于C语言中if,e ...

  9. C语言中,scanf与scanf_s的简单区别

    C语言中,scanf与scanf_s的简单区别 scanf()不会检查输入边界,可能造成数据溢出,scanf_s()会进行边界检查. 如name[5], scanf("%s",na ...

最新文章

  1. 阿里云安全肖力:安全基础建设是企业数字化转型的基石
  2. 查看centos中mysql的日志的命令_CentOS系统中常用查看日志命令
  3. 已经感冒好长一段时间了 不过今天我的新blog开张
  4. java中获取文件总行数_关于java:如何以有效的方式获取文件中的行数?
  5. SAP ABAP Netweaver里的SE80事务码是如何响应用户请求的
  6. 计算机主机接线视频教程,电脑主板跳线怎么接?电脑机箱与主板跳线接法图解教程...
  7. 用Windows 10自带的paint/画图 软件删除图片中的文字,并且添加新文字,适合学术应用,有截图
  8. 运用范式的规范数据库设计的好处
  9. 在ubuntu下打开.TXT文件,中文显示为乱码
  10. js+运行+php+文件,php中运行JS
  11. DB2with的定义与用法
  12. 人人都能看懂的LSTMGRU
  13. php创建mysql分区_创建mysql表分区的方法_MySQL
  14. 商品库存管理系统(c语言)
  15. adminLTE模态框弹出页面样例
  16. 基于MATLAB的条形码二维码检测系统
  17. [Node.js] rsaaes 加密解密
  18. 教育网Linux下赶mule
  19. [转]在低调中修炼自己
  20. 手机号,身份证号,姓名等校验

热门文章

  1. vue项目全局把px转换成rem
  2. 目标检测语义分割:隧道裂缝裂痕检测实战,有数据+代码
  3. 冒泡排序算法-DEMO
  4. BERT gated multi-window attention network for relation extraction 用于关系抽取的BERT门控多窗口注意力网络
  5. MASK RCNN 之RPN
  6. android字体变斜,TextView设置倾斜字体样式(android:textStyle=bold|italic)后,右边字显示不全...
  7. js 前进 后退 刷新
  8. 高通camera驱动 camx相关内容 (二)
  9. 干货|苹果官网色彩搭配的“黄金法则”
  10. Jcrop是一个功能强大的图像裁剪引擎