如何写入 /proc 内核模块
How to write to a /proc kernel module
用户写入proc时如何获取数据? (即:echo "foo" > /proc/myproc)
我看过从 proc 读取的内容(即用户执行 "cat /proc/myproc"),详见本网站:http://www.linux.com/learn/linux-training/39972-kernel-debugging-with-proc-qsequenceq-files-part-2-of-3
好像还可以,但是没看到类似的写法。另外,我查看了 TLDP,但他们的文章似乎已经过时了:http://tldp.org/LDP/lkmpg/2.6/html/x769.html
实际上用于处理/proc
和/sys
的内核API可能因不同的内核版本而异。好消息是内核本身是不言自明的。意味着您可以轻松找到代码示例,只需探索源代码即可。在 /proc
中寻找一些支持写入操作的文件:
$ ls -l /proc | grep w
例如 sysrq-trigger
做:
--w------- 1 root root 0 Mar 12 00:41 sysrq-trigger
然后在kernel sources中找到对应的字符串:
$ find . -name '*.[ch]' -exec grep -Hn '"sysrq-trigger"' {} \;
这给你:
drivers/tty/sysrq.c:1105: if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
现在查看找到的文件中的代码(查看 here 版本 3.18):
static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
if (count) {
char c;
if (get_user(c, buf))
return -EFAULT;
__handle_sysrq(c, false);
}
return count;
}
static const struct file_operations proc_sysrq_trigger_operations = {
.write = write_sysrq_trigger,
.llseek = noop_llseek,
};
static void sysrq_init_procfs(void)
{
if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
&proc_sysrq_trigger_operations))
pr_err("Failed to register proc interface\n");
}
您可以对某些 sysfs
文件执行相同的操作。为了更快地搜索,使用一些代码索引器(例如 cscope
用于 vim,或 Eclipse 中的内置代码索引器)。
用户写入proc时如何获取数据? (即:echo "foo" > /proc/myproc)
我看过从 proc 读取的内容(即用户执行 "cat /proc/myproc"),详见本网站:http://www.linux.com/learn/linux-training/39972-kernel-debugging-with-proc-qsequenceq-files-part-2-of-3
好像还可以,但是没看到类似的写法。另外,我查看了 TLDP,但他们的文章似乎已经过时了:http://tldp.org/LDP/lkmpg/2.6/html/x769.html
实际上用于处理/proc
和/sys
的内核API可能因不同的内核版本而异。好消息是内核本身是不言自明的。意味着您可以轻松找到代码示例,只需探索源代码即可。在 /proc
中寻找一些支持写入操作的文件:
$ ls -l /proc | grep w
例如 sysrq-trigger
做:
--w------- 1 root root 0 Mar 12 00:41 sysrq-trigger
然后在kernel sources中找到对应的字符串:
$ find . -name '*.[ch]' -exec grep -Hn '"sysrq-trigger"' {} \;
这给你:
drivers/tty/sysrq.c:1105: if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
现在查看找到的文件中的代码(查看 here 版本 3.18):
static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
if (count) {
char c;
if (get_user(c, buf))
return -EFAULT;
__handle_sysrq(c, false);
}
return count;
}
static const struct file_operations proc_sysrq_trigger_operations = {
.write = write_sysrq_trigger,
.llseek = noop_llseek,
};
static void sysrq_init_procfs(void)
{
if (!proc_create("sysrq-trigger", S_IWUSR, NULL,
&proc_sysrq_trigger_operations))
pr_err("Failed to register proc interface\n");
}
您可以对某些 sysfs
文件执行相同的操作。为了更快地搜索,使用一些代码索引器(例如 cscope
用于 vim,或 Eclipse 中的内置代码索引器)。