Ejsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/core-api/printk-basicsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/zh_TW/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/it_IT/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ja_JP/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ko_KR/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/pt_BR/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/sp_SP/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhW/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/core-api/printk-basics.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h)Documentation/core-api/printk-basics.rst h]h)}(h(Documentation/core-api/printk-basics.rsth]h(Documentation/core-api/printk-basics.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubj)}(h\司延腾 Yanteng Si 周彬彬 Binbin Zhou h]h)}(h[司延腾 Yanteng Si 周彬彬 Binbin Zhou h](h司延腾 Yanteng Si <}(hj4hhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1j<hj4ubh> 周彬彬 Binbin Zhou <}(hj4hhhNhNubj=)}(hzhoubinbin@loongson.cnh]hzhoubinbin@loongson.cn}(hjRhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:zhoubinbin@loongson.cnuh1j<hj4ubh>}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj0ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h.. _cn_printk-basics.rst:h]h}(h]h ]h"]h$]h&]refidcn-printk-basics-rstuh1j~hKhhhhhhubhsection)}(hhh](htitle)}(h使用printk记录消息h]h使用printk记录消息}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hXprintk()是Linux内核中最广为人知的函数之一。它是我们打印消息的标准工具,通常也是追踪和调试 的最基本方法。如果你熟悉printf(3),你就能够知道printk()是基于它的,尽管它在功能上有一些不 同之处:h]hXprintk()是Linux内核中最广为人知的函数之一。它是我们打印消息的标准工具,通常也是追踪和调试 的最基本方法。如果你熟悉printf(3),你就能够知道printk()是基于它的,尽管它在功能上有一些不 同之处:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh block_quote)}(hX$- printk() 消息可以指定日志级别。 - 格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 ``%n`` 或浮点转换指定符)。参见:ref: `如何正确地获得printk格式指定符` 。 h]h bullet_list)}(hhh](h list_item)}(h+printk() 消息可以指定日志级别。 h]h)}(h*printk() 消息可以指定日志级别。h]h*printk() 消息可以指定日志级别。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 ``%n`` 或浮点转换指定符)。参见:ref: `如何正确地获得printk格式指定符` 。 h]h)}(h格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 ``%n`` 或浮点转换指定符)。参见:ref: `如何正确地获得printk格式指定符` 。h](h}格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 }(hjhhhNhNubhliteral)}(h``%n``h]h%n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ 或浮点转换指定符)。参见:ref: }(hjhhhNhNubhtitle_reference)}(h?`如何正确地获得printk格式指定符`h]h=如何正确地获得printk格式指定符}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubh)}(h所有的printk()消息都会被打印到内核日志缓冲区,这是一个通过/dev/kmsg输出到用户空间的环 形缓冲区。读取它的通常方法是使用 ``dmesg`` 。h](h所有的printk()消息都会被打印到内核日志缓冲区,这是一个通过/dev/kmsg输出到用户空间的环 形缓冲区。读取它的通常方法是使用 }(hj"hhhNhNubj)}(h ``dmesg``h]hdmesg}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh 。}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h%printk()的用法通常是这样的::h]h$printk()的用法通常是这样的:}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(h'printk(KERN_INFO "Message: %s\n", arg);h]h'printk(KERN_INFO "Message: %s\n", arg);}hjRsbah}(h]h ]h"]h$]h&]hhuh1jPhhhKhjhhubh)}(h其中 ``KERN_INFO`` 是日志级别(注意,它与格式字符串连在一起,日志级别不是一个单独的参数)。 可用的日志级别是:h](h其中 }(hj`hhhNhNubj)}(h ``KERN_INFO``h]h KERN_INFO}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh 是日志级别(注意,它与格式字符串连在一起,日志级别不是一个单独的参数)。 可用的日志级别是:}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK!hjhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]colwidthK/uh1jhjubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(h名称h]h名称}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 字符串h]h 字符串}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 别名函数h]h 别名函数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjubhtbody)}(hhh](j)}(hhh](j)}(hhh]h)}(h KERN_EMERGh]h KERN_EMERG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h"0"h]h“0”}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hj&ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h pr_emerg()h]h pr_emerg()}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hj=ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_ALERTh]h KERN_ALERT}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hj]ubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(hhh]h)}(h"1"h]h“1”}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjtubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(hhh]h)}(h pr_alert()h]h pr_alert()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_CRITh]h KERN_CRIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"2"h]h“2”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_crit()h]h pr_crit()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(hKERN_ERRh]hKERN_ERR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"3"h]h“3”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hpr_err()h]hpr_err()}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hj'ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_WARNINGh]h KERN_WARNING}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjGubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(h"4"h]h“4”}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hj^ubah}(h]h ]h"]h$]h&]uh1jhjDubj)}(hhh]h)}(h pr_warn()h]h pr_warn()}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjuubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_NOTICEh]h KERN_NOTICE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"5"h]h“5”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_notice()h]h pr_notice()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_INFOh]h KERN_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"6"h]h“6”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_info()h]h pr_info()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_DEBUGh]h KERN_DEBUG}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hj1ubah}(h]h ]h"]h$]h&]uh1jhj.ubj)}(hhh]h)}(h"7"h]h“7”}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjHubah}(h]h ]h"]h$]h&]uh1jhj.ubj)}(hhh]h)}(h,pr_debug() and pr_devel() 若定义了DEBUGh]h,pr_debug() and pr_devel() 若定义了DEBUG}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hj_ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_DEFAULTh]h KERN_DEFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hhh]h)}(h""h]h“”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jhj|ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh]h)}(h KERN_CONTh]h KERN_CONT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"c"h]h“c”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_cont()h]h pr_cont()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]colsKuh1jhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubh)}(hX5日志级别指定了一条消息的重要性。内核根据日志级别和当前 *console_loglevel* (一个内核变量)决 定是否立即显示消息(将其打印到当前控制台)。如果消息的优先级比 *console_loglevel* 高(日志级 别值较低),消息将被打印到控制台。h](hR日志级别指定了一条消息的重要性。内核根据日志级别和当前 }(hjhhhNhNubhemphasis)}(h*console_loglevel*h]hconsole_loglevel}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjubh{ (一个内核变量)决 定是否立即显示消息(将其打印到当前控制台)。如果消息的优先级比 }(hjhhhNhNubj&)}(h*console_loglevel*h]hconsole_loglevel}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjubhD 高(日志级 别值较低),消息将被打印到控制台。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK>hjhhubh)}(hK如果省略了日志级别,则以 ``KERN_DEFAULT`` 级别打印消息。h](h%如果省略了日志级别,则以 }(hjQhhhNhNubj)}(h``KERN_DEFAULT``h]h KERN_DEFAULT}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubh 级别打印消息。}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKBhjhhubh)}(h=你可以用以下方法检查当前的 *console_loglevel* ::h](h(你可以用以下方法检查当前的 }(hjqhhhNhNubj&)}(h*console_loglevel*h]hconsole_loglevel}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjqubeh}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubjQ)}(h:$ cat /proc/sys/kernel/printk 4 4 1 7h]h:$ cat /proc/sys/kernel/printk 4 4 1 7}hjsbah}(h]h ]h"]h$]h&]hhuh1jPhhhKFhjhhubh)}(hT结果显示了 *current*, *default*, *minimum* 和 *boot-time-default* 日志级别h](h结果显示了 }(hjhhhNhNubj&)}(h *current*h]hcurrent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjubh, }(hjhhhNhNubj&)}(h *default*h]hdefault}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjubh, }hjsbj&)}(h *minimum*h]hminimum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjubh 和 }(hjhhhNhNubj&)}(h*boot-time-default*h]hboot-time-default}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j%hjubh 日志级别}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh)}(h要改变当前的 console_loglevel,只需在 ``/proc/sys/kernel/printk`` 中写入所需的 级别。例如,要打印所有的消息到控制台上::h](h0要改变当前的 console_loglevel,只需在 }(hjhhhNhNubj)}(h``/proc/sys/kernel/printk``h]h/proc/sys/kernel/printk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhN 中写入所需的 级别。例如,要打印所有的消息到控制台上:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKKhjhhubjQ)}(h"# echo 8 > /proc/sys/kernel/printkh]h"# echo 8 > /proc/sys/kernel/printk}hjsbah}(h]h ]h"]h$]h&]hhuh1jPhhhKNhjhhubh)}(h$另一种方式,使用 ``dmesg``::h](h另一种方式,使用 }(hjhhhNhNubj)}(h ``dmesg``h]hdmesg}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKPhjhhubjQ)}(h # dmesg -n 5h]h # dmesg -n 5}hj?sbah}(h]h ]h"]h$]h&]hhuh1jPhhhKRhjhhubh)}(hx设置 console_loglevel 打印 KERN_WARNING (4) 或更严重的消息到控制台。更多消息参 见 ``dmesg(1)`` 。h](hh设置 console_loglevel 打印 KERN_WARNING (4) 或更严重的消息到控制台。更多消息参 见 }(hjMhhhNhNubj)}(h ``dmesg(1)``h]hdmesg(1)}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh 。}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKThjhhubh)}(h作为printk()的替代方案,你可以使用 ``pr_*()`` 别名来记录日志。这个系列的宏在宏名中 嵌入了日志级别。例如::h](h0作为printk()的替代方案,你可以使用 }(hjmhhhNhNubj)}(h ``pr_*()``h]hpr_*()}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhW 别名来记录日志。这个系列的宏在宏名中 嵌入了日志级别。例如:}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKWhjhhubjQ)}(h*pr_info("Info message no. %d\n", msg_num);h]h*pr_info("Info message no. %d\n", msg_num);}hjsbah}(h]h ]h"]h$]h&]hhuh1jPhhhKZhjhhubh)}(h打印 ``KERN_INFO`` 消息。h](h打印 }(hjhhhNhNubj)}(h ``KERN_INFO``h]h KERN_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 消息。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK\hjhhubh)}(h除了比等效的printk()调用更简洁之外,它们还可以通过pr_fmt()宏为格式字符串使用一个通用 的定义。例如,在源文件的顶部(在任何 ``#include`` 指令之前)定义这样的内容。::h](h除了比等效的printk()调用更简洁之外,它们还可以通过pr_fmt()宏为格式字符串使用一个通用 的定义。例如,在源文件的顶部(在任何 }(hjhhhNhNubj)}(h ``#include``h]h#include}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) 指令之前)定义这样的内容。:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK^hjhhubjQ)}(h;#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__h]h;#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__}hjsbah}(h]h ]h"]h$]h&]hhuh1jPhhhKahjhhubh)}(h_会在该文件中的每一条 pr_*() 消息前加上发起该消息的模块和函数名称。h]h_会在该文件中的每一条 pr_*() 消息前加上发起该消息的模块和函数名称。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjhhubh)}(h为了调试,还有两个有条件编译的宏: pr_debug()和pr_devel(),除非定义了 ``DEBUG`` (或者在pr_debug()的情况下定义了 ``CONFIG_DYNAMIC_DEBUG`` ),否则它们不会被编译。h](h^为了调试,还有两个有条件编译的宏: pr_debug()和pr_devel(),除非定义了 }(hjhhhNhNubj)}(h ``DEBUG``h]hDEBUG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ (或者在pr_debug()的情况下定义了 }(hjhhhNhNubj)}(h``CONFIG_DYNAMIC_DEBUG``h]hCONFIG_DYNAMIC_DEBUG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# ),否则它们不会被编译。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKehjhhubj)}(hhh](j)}(h 函数接口h]h 函数接口}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)hhhhhKkubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKmhj)hhubh)}(hinclude/linux/printk.hh]hinclude/linux/printk.h}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohj)hhubeh}(h]id1ah ]h"] 函数接口ah$]h&]uh1jhjhhhhhKkubeh}(h](printkjeh ]h"](使用printk记录消息cn_printk-basics.rsteh$]h&]uh1jhhhhhhhKexpect_referenced_by_name}jdjsexpect_referenced_by_id}jjsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}j]jasnameids}(jdjjcj`j[jXu nametypes}(jdjcj[uh}(jjj`jjXj)u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]hsystem_message)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOlineK9sourcehuh1jhjubatransform_messages]j)}(hhh]h)}(hhh]h:Hyperlink target "cn-printk-basics-rst" is not referenced.}hj sbah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]levelKtypej sourcehnjlineKuh1juba transformerN include_log];Documentation/translations/zh_CN/core-api/printk-basics.rst(NNNNta decorationNhhub.