Linux内核源码的klogd和prink

June 12, 2017 | 0 Minute Read

klogd读取的/proc/kmsg文件 http://elixir.free-electrons.com/linux/v4.12-rc5/source/fs/proc/kmsg.c

读取这个/proc/kmsg文件其实就是调用 syslog这个系统调用 do_syslog http://elixir.free-electrons.com/linux/v4.12-rc5/source/kernel/printk/printk.c#L1430

这个会等在一个锁上面

printk 会在执行完之后,调用console_unlock wake_up_klogd函数唤醒这个锁。

/dev/kmsg 设备文件的操作 也子啊printk.c 里面

const struct file_operations kmsg_fops = {
	.open = devkmsg_open,
	.read = devkmsg_read,
	.write_iter = devkmsg_write,
	.llseek = devkmsg_llseek,
	.poll = devkmsg_poll,
	.release = devkmsg_release,
};

devkmsg_read 同样阻塞在 log_wait 这个锁上面

不过试了一下 cat /proc/kmsg 和 cat /dev/kmsg,前者只会阻塞等待新消息,  后者会把历史buf的消息也显示出来。 用strace 跟踪了一下 dmesg命令 应该是使用的/dev/kmsg文件来的吧。

其他的设置终端console的printk级别 echo 8 > /proc/sys/kernel/printk