私は方法を知りたい印刷それでは、Linuxカーネルログメッセージは後ろでどのように機能しますか?
答え1
偶然です、私は本で見ました。Linuxデバイスドライバv3。 第4章その本はこう言います。
メッセージを録音する方法
この関数は、カーネルの設定時に選択された4 KBから1 MBの間の値であるバイト長の循環バッファ
printk
にメッセージを書き込みます。その後、関数はメッセージを待っているすべてのプロセス、つまり__LOG_BUF_LEN
システムコールでsyslog
スリープ状態または読み取り中のすべてのプロセスを起動します/proc/kmsg
。ロギングエンジンへの2つのインターフェイスはほぼ同じですが、読み取り操作はログバッファ内/proc/kmsg
のデータを消費しますが、syslog
システムコールはオプションでログデータを別のプロセスに委任しながらログデータを返すことができます。通常、/proc
ファイルを読む方が簡単ですklogd
。 yesこのdmesg
コマンドは、バッファをフラッシュせずにバッファの内容を表示するために使用できます。実際、このコマンドはstdout
バッファの内容を読み取ったかどうかにかかわらず返します。 。カーネルメッセージを手動で読み取ると、ストップ後にリーダーがブロックしてより多くのデータを待つため、ファイルがFIFOのように見える
klogd
ことがわかります。他のプロセスがすでに同じデータを読み取っている場合は競合が発生するため、/proc
この方法でメッセージを読み取ることはできません。klogd
循環バッファがいっぱいになると、printk
循環バッファの先頭に新しいデータの追加が開始され、最も古いデータが上書きされます。そのため、ロギングプロセスで古いデータが失われます。 ...Linuxメッセージング方法のもう1つの特徴は、割り込みハンドラprintk
でもどこでも呼び出すことができ、印刷できるデータ量に制限がないことです。唯一の欠点は、一部のデータが失われる可能性があることです。