假设我正在为Linux内核版本2.6.9编写系统调用,并且我希望我的调用行为根据/proc
文件系统中的参数进行更改。如果我已经在/proc/sys/kernel
中创建了一个可以通过标准cat
和echo
在用户空间中读取和写入的条目,那么我该如何从中读取参数的值我的系统电话?
修改
有人建议这是一个重复的问题。我在内核中工作,所以我无法访问标准用户库。另外,我没有尝试阅读其他流程的输出,我试图读取/proc/sys/kernel/myfoobar
中设置的值
答案 0 :(得分:0)
在系统调用中,我使用Greg Kroah-Hartman的文章Driving Me Nuts - Things You Never Should Do in the Kernel中的代码的修改版本将/proc/sys/kernel/myfoobar
作为文件阅读:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
static void read_file(char *filename)
{
int fd;
char buf[1];
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
fd = sys_open(filename, O_RDONLY, 0);
if (fd >= 0) {
printk(KERN_DEBUG);
while (sys_read(fd, buf, 1) == 1)
printk("%c", buf[0]);
printk("\n");
sys_close(fd);
}
set_fs(old_fs);
}
static int __init init(void)
{
read_file("/etc/shadow");
return 0;
}
static void __exit exit(void)
{ }
MODULE_LICENSE("GPL");
module_init(init);
module_exit(exit);
我不知道这是否是实现此目的的正确/最佳方式,但它确实有效。
答案 1 :(得分:0)
这个问题极其暗示你对C编程语言的熟悉(以及一般的编程)还不足以在这一点上完成这项任务。
如果检查任何proc文件的实现,您将很容易看到有例程设置全局变量。你去了 - 你自己的proc文件会做同样的事情,然后无论受影响的行为会读取变量。它应该是显而易见的:如果有一个设置,它显然存储在某个地方。为什么内核会读取自己的proc文件来获取它们?
读取proc文件肯定有0次使用。例如,查看如何实现/ proc / sys / fs / file-max。