什么扩展了 KERN_INFO,它在哪里实现?
What exactly expands the KERN_INFO, and where it is implemented?
在这个问题中:,有人说KERN_INFO
扩展为""[=12=]1" "6"
。我知道第一个 [=13=]
是空字符,但是 01
是什么?因为我想是八进制的。当预处理器将它连接在一起成为 "[=15=]16"
时,null 之后的其余部分是 016
,即十进制的 14
。所以我在 ascii
中查找并发现它是 0E SO (shift out)
?这对我来说没有意义,它应该与日志记录有关(因为它是 printk
的目的)。那么扩展后的KERN_INFO
宏序列是什么意思呢?
此外,我试图在 /usr/include/linux/kernel.h
中查看源代码,但没有找到宏。那么它是在 kernel.h
还是其他地方?
"[=10=]1" "6"
是两个字符串文字,它们将(与任何其他相邻的字符串文字)连接成一个字符串文字。 (连接在 C 标准中定义的 翻译阶段 6 完成。)
这些字符串文字中的第一个 "[=11=]1"
包含单个 八进制转义序列 ,定义单个字符。字符串文字或字符常量中的八进制转义序列由反斜杠 (\
) 后跟 1 到 3 个八进制数字(在本例中为 001
)组成。在这种情况下,单个字符的数字代码为 1,对应于 ASCII SOH(标题开始)字符。
字符串文字 "[=14=]16"
包含两个字符 '[=15=]1'
和 '6'
的序列,因为八进制转义序列总是在最多 3 个八进制数字后终止。
转义序列不跨越相邻字符串文字之间的边界。 (转义序列在翻译阶段 3 扩展,因此在相邻字符串文字在翻译阶段 6 连接之前已经扩展)。因此,字符串文字对 "" "6"
等价于(连接后)单个字符串文字 "[=14=]16"
,而不是 ""
.
如@Peter L.所述,KERN_INFO
宏和其他"kernel level"宏定义在Linux内核源代码的"include/linux/kern_levels.h"中。实际上,从内核版本 3.6 开始就是如此。在内核版本 3.6 之前,它们在 "include/linux/printk.h" 中定义,并使用不同的字符串格式,在尖括号之间指定内核级别编号(例如 KERN_INFO
曾经被定义为 "<6>"
)。
这些内核级宏的目的是在 printk
函数的格式字符串参数前加上特殊代码,以指定 log-level 用于写入内核日志的消息(除了来自 KERN_CONT
,指定该消息将附加到上一条消息)。
在这个问题中:KERN_INFO
扩展为""[=12=]1" "6"
。我知道第一个 [=13=]
是空字符,但是 01
是什么?因为我想是八进制的。当预处理器将它连接在一起成为 "[=15=]16"
时,null 之后的其余部分是 016
,即十进制的 14
。所以我在 ascii
中查找并发现它是 0E SO (shift out)
?这对我来说没有意义,它应该与日志记录有关(因为它是 printk
的目的)。那么扩展后的KERN_INFO
宏序列是什么意思呢?
此外,我试图在 /usr/include/linux/kernel.h
中查看源代码,但没有找到宏。那么它是在 kernel.h
还是其他地方?
"[=10=]1" "6"
是两个字符串文字,它们将(与任何其他相邻的字符串文字)连接成一个字符串文字。 (连接在 C 标准中定义的 翻译阶段 6 完成。)
这些字符串文字中的第一个 "[=11=]1"
包含单个 八进制转义序列 ,定义单个字符。字符串文字或字符常量中的八进制转义序列由反斜杠 (\
) 后跟 1 到 3 个八进制数字(在本例中为 001
)组成。在这种情况下,单个字符的数字代码为 1,对应于 ASCII SOH(标题开始)字符。
字符串文字 "[=14=]16"
包含两个字符 '[=15=]1'
和 '6'
的序列,因为八进制转义序列总是在最多 3 个八进制数字后终止。
转义序列不跨越相邻字符串文字之间的边界。 (转义序列在翻译阶段 3 扩展,因此在相邻字符串文字在翻译阶段 6 连接之前已经扩展)。因此,字符串文字对 "" "6"
等价于(连接后)单个字符串文字 "[=14=]16"
,而不是 ""
.
如@Peter L.所述,KERN_INFO
宏和其他"kernel level"宏定义在Linux内核源代码的"include/linux/kern_levels.h"中。实际上,从内核版本 3.6 开始就是如此。在内核版本 3.6 之前,它们在 "include/linux/printk.h" 中定义,并使用不同的字符串格式,在尖括号之间指定内核级别编号(例如 KERN_INFO
曾经被定义为 "<6>"
)。
这些内核级宏的目的是在 printk
函数的格式字符串参数前加上特殊代码,以指定 log-level 用于写入内核日志的消息(除了来自 KERN_CONT
,指定该消息将附加到上一条消息)。