Ubuntu 10.04 マシンで簡単な hello-world モジュールを作成しました。モジュールをロードおよびアンロードするとき、printk は次の hello_world および bye_world 関数からのメッセージをログに記録する必要があります。
static int hello_world()
{
printk(KERN_INFO "Hello, beautiful world");
return 0;
}
static void bye_world()
{
printk(KERN_INFO "Good-bye kernel uncle");
}
module_init(hello_world);
module_exit(bye_world);
しかし、実際に hello.ko モジュールを挿入して削除すると、端末に出力されたメッセージ (現在の端末にリダイレクトしたもの) がちょうど 1 メッセージ遅れていることがわかります。
# rmmod hello.ko # Jul 8 16:34:02 panchavati kernel: [64599.954113] Hello, beautiful world # insmod hello.ko # Jul 8 16:34:57 panchavati kernel: [65456.367422] Good-bye kernel uncle
dmesg の出力から、次のメッセージ エントリ (insmod に対応) が既にログに記録されていることがわかりますが、まだ出力されていません。
chanakya@panchavati:~$ dmesg | tail -2 [65456.367422] Good-bye kernel uncle [65511.198299] Hello, beautiful world
エントリ[65511.198299]
はカーネル ログにありますが、前のエントリのみ[65456.367422] Good-bye kernel uncle
が出力されました。なぜそうなのですか?
以前は、/etc/syslog.conf で使用されている「-」指定子がこれを処理する必要があるのではないかと考えていましたが (書き込みのたびに同期が妨げられます)、削除しても機能しませんでした。