通过/ proc?

时间:2017-09-25 14:58:09

标签: c linux-kernel

假设我正在为Linux内核版本2.6.9编写系统调用,并且我希望我的调用行为根据/proc文件系统中的参数进行更改。如果我已经在/proc/sys/kernel中创建了一个可以通过标准catecho在用户空间中读取和写入的条目,那么我该如何从中读取参数的值我的系统电话?

修改
有人建议这是一个重复的问题。我在内核中工作,所以我无法访问标准用户库。另外,我没有尝试阅读其他流程的输出,我试图读取/proc/sys/kernel/myfoobar中设置的值

2 个答案:

答案 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。