Ki- [[カーネル空間]]では[[glibc]]の`printf`が使えない。代わりに`printk`を使う - ヘッダファイルは`/include/linux/printk.h`([Github](https://github.com/torvalds/linux/blob/master/include/linux/printk.h)) - 実装は`/kernel/printk/printk.c`([GitHub](https://github.com/torvalds/linux/blob/master/include/linux/printk.h)) - カーネル内のログバッファ(リングバッファ)に書き出される。`dmesg`で確認できる - リングバッファは再起動で消えるが、`journalctl -k`で永続化された内容を確認できる - /dev/consoleに出力されることもある ## 例 ```c printk(KERN_INFO "Hi!"); ``` - 文字列の前にログレベルを付けることができる(付けないと`KERN_WARNING`) - ログレベル: [`kern_levels.h`](https://github.com/torvalds/linux/blob/master/include/linux/kern_levels.h) - `pr_info`, `pr_warn`などのマクロもある - `pr_cont`は直前のログレベルを引き継げる - `pr_*_ratelimited()`マクロを使うと、一定時間内に出力される同じメッセージの数を抑制できる - `dev_*()`マクロを使うと、デバイス名がプレフィックスにつく: [`dev_printk.h`](https://github.com/torvalds/linux/blob/master/include/linux/dev_printk.h) ちなみに、ユーザー空間からも`/dev/kmsg`に書き込めばリングバッファに出力できる