我正在寫一個Linux字符驅動程序,它可以在用戶空間中打印系統日誌。就像命令'dmesg'一樣。 我知道我們用'printk'打印的所有日誌都會被髮送到名爲環形緩衝區的空間。所以我有這樣的問題:如何在Linux內核空間讀取環形緩衝區?
- 是在內核空間內的環形緩衝區?
- 如果是這樣,我怎樣才能讀取內核空間內的環形緩衝區? (我嘗試讀取dmesg.c的源代碼,但它沒有幫助。)
我正在寫一個Linux字符驅動程序,它可以在用戶空間中打印系統日誌。就像命令'dmesg'一樣。 我知道我們用'printk'打印的所有日誌都會被髮送到名爲環形緩衝區的空間。所以我有這樣的問題:如何在Linux內核空間讀取環形緩衝區?
Pavan很好的答案(教給我很多):
不同的發行版可能會將/ proc/kmsg的輸出重定向到任何他們喜歡的物理日誌文件或虛擬設備(/ dev/xxx)。但「的/ proc/kmsg」是核心日誌的原始來源,因爲內核實現了環行緩衝器動作裏面FS的/ proc/kmsg.c:
static const struct file_operations proc_kmsg_operations = {
.read = kmsg_read,
.poll = kmsg_poll,
.open = kmsg_open,
.release = kmsg_release,
.llseek = generic_file_llseek,
};
所以你怎麼看到的輸出是這樣的:
須藤尾-f的/ proc/kmsg
但是,你只能看到生成後,您必須發出此命令的所有消息 - 在環形緩衝區之前的所有消息將不被打印出來。因此要查看物理文件輸出,可以搜索「/ proc/kmsg」的用戶:
sudo lsof | grep proc。kmsg
而且我的機器表示這樣的:
rsyslogd 1743 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imuxso 1743 1755 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imklog 1743 1756 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
rs:main 1743 1757 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
所以現在是PID 1743,讓我們來看看這些文件FD由1743打開:
須藤LS -al的/ proc/1743/FD
lrwx------ 1 root root 64 Dec 11 08:36 0 -> socket:[14472]
l-wx------ 1 root root 64 Dec 11 08:36 1 -> /var/log/syslog
l-wx------ 1 root root 64 Dec 11 08:36 2 -> /var/log/kern.log
lr-x------ 1 root root 64 Dec 11 08:36 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 11 08:36 4 -> /var/log/auth.log
所以你去那裏,PID 1743是rsyslogd,和它的/ proc/kmsg輸出重定向到像在/ var/log/syslog的和/var/log/kern.log等
文件10
令人驚歎!非常專業和有用的答案!你看,我只是Linux內核編程的新成員,我無法感謝你的幫助。謝謝你,兄弟。 – 2012-03-03 05:43:34
很高興我能幫助你:)歡迎來到SO! – 2012-03-03 06:11:03