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`に書き込めばリングバッファに出力できる