从pid获取完整的进程名

3

我正在一个内核模块中,想要从给定的 pid 中获得整个进程名称。具体来说:我想要 /proc/PID/cmdline 中的那一行。

问题是 task_struct->comm[] 只有 15 个字节长,不能处理程序手动更改他的 argv[] 或通过 setproctitle(3) 更改的情况...

有任何想法? :)

2个回答

4
你可以看看内核是如何实现的。你会看到这个函数:
proc_pid_cmdline(struct task_struct *task, char * buffer)

这个过程相对简单,一旦你获得了需要关注的进程的task_struct,你就可以使用access_process_vm()mm->arg_start中提取你想要的部分。


我之前使用了这个函数,但是现在我只能访问argv[0],无法访问整个argv。 :( - user177839
1
thomasbl:你正在访问整个argv,只是停在第一个'\0',这是argv[0]的结尾 - 每个元素都由'\0'分隔。 - caf
谢谢你给出了我问题的正确答案!但是昨天我没有看到你的回答,所以今天我自己找到了答案 :) - user177839

2
打开/proc/<pid>/cmdline文件并读取其中的内容有什么问题吗?这个文件包含进程的命令行参数。

问题在于我劫持了open()系统调用,如果我尝试打开/proc/pid/cmdline进行读取,就会陷入无限循环。 - user177839
1
你难道不可以简单地将系统调用链接起来吗?换句话说,在你接管它之前,保存它的最后一个值。这样,你就可以直接调用旧的值。 - paxdiablo
否则,您将不得不在拦截器中提供所有开放功能,而不仅仅是添加代码以执行新功能并让旧功能由内核适当处理。 - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接