我正在编写一个内核模块,以获取具有完整进程名称的pid列表。 proc_pid_cmdline()提供完整的进程名称;使用相同的函数/proc/*/cmdline获取完整的进程名称。 (struct task_struct) -> comm提示它是什么过程,但不完整。

我已经包含了函数名称,但是它给出了错误,因为它不知道在哪里可以找到该函数。

如何在模块中使用proc_pid_cmdline()

最佳答案

您不应该调用proc_pid_cmdline()

这是fs/proc/base.c中的non-public function:

static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns,
                            struct pid *pid, struct task_struct *task)

但是,它的作用很简单:
get_cmdline(task, m->buf, PAGE_SIZE);

但是,这不太可能返回完整路径,并且在每种情况下都不可能确定完整路径。 arg [0]的值可能会被覆盖,文件可能会被删除或移动,等等。进程可能以某种方式使exec()掩盖了原始命令行以及所有其他疾病。

扫描我的Fedora 20系统/proc/*/cmdline会得到各种没用的结果:
-F
BUG:
WARNING: at
WARNING: CPU:
INFO: possible recursive locking detecte
ernel BUG at
list_del corruption
list_add corruption
do_IRQ: stack overflow:
ear stack overflow (cur:
eneral protection fault
nable to handle kernel
ouble fault:
RTNL: assertion failed
eek! page_mapcount(page) went negative!
adness at
NETDEV WATCHDOG
ysctl table check failed
: nobody cared
IRQ handler type mismatch
Machine Check Exception:
Machine check events logged
divide error:
bounds:
coprocessor segment overrun:
invalid TSS:
segment not present:
invalid opcode:
alignment check:
stack segment:
fpu exception:
simd exception:
iret exception:
/var/log/messages
--
/usr/bin/abrt-dump-oops
-xtD

08-27 21:52