【问题标题】:Read /proc from within a module从模块中读取 /proc
【发布时间】:2014-06-03 05:34:26
【问题描述】:

也许我只是说错了。

我有一个 Linux 模块 (Ubuntu 12.04),它需要收集有关当前进程的信息,例如每个进程打开的文件数等。我认为执行此操作的最佳方法是让模块读取 /proc 并为其中表示的每个进程在 /proc 子目录中查找所需的信息。

显然我的模块不能调用 opendir/readdir。我原以为有一个 proc_readdir() 可以从内核空间使用,但我似乎找不到任何相关信息。

我错过了什么吗?模块有没有更好的方法来收集进程信息?如果是 proc_readdir() 那么我在哪里可以找到一些例子呢?

【问题讨论】:

  • 请记住,/proc 是由内核和 VFS 层提供的。大多数驱动程序都是 VFS 的一部分。因此,如果您可以以这种方式打开文件,则可以在当前驱动程序中创建访问当前驱动程序的无限循环。那可不好。

标签: linux-kernel linux-device-driver


【解决方案1】:

如果您只是转向内核空间编程,您可能需要很长时间才能习惯以正确的方式做事。 /proc 只是内核空间数据结构的一个接口,并且是一个不方便的接口(所有的 ASCII 会怎样)。由于您在内核中,因此您可以直接访问所需的数据。

您应该查看进程 task_struct 条目(请参阅http://lxr.linux.no/linux+v3.5.3/include/linux/sched.h)。如果您想遍历每个进程,请尝试以下操作:

struct task_struct *task;
for_each_process(task) {
    printk(KERN_INFO "Process %i is named %s\n", task->pid, task->comm); 
}

您还可以使用find_task_by_pid_ns 通过 pid 查找特定任务,但您必须担心 pid 命名空间。还有get_current,它会为你找到当前正在执行的任务。

【讨论】:

  • 我什至不知道是否为stackoverflow规则评论这个OK,但你是一个英雄。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2021-12-13
  • 2012-03-06
相关资源
最近更新 更多