【问题标题】:get _complete_ process name from pid从 pid 获取 _complete_ 进程名称
【发布时间】:2009-09-23 14:24:38
【问题描述】:

我在一个内核模块中,我想拥有整个进程名称 从给定的pid。确切地说:我想要 /proc/PID/cmdline 中保留的行。

问题是task_struct->comm[] 只有 15 个字节长并且无法处理 如果程序手动或通过 setproctitle(3) 更改他的argv[]...

有什么想法吗? :)

【问题讨论】:

    标签: linux linux-kernel kernel


    【解决方案1】:

    你总是可以看看内核是如何做到的。你会看到函数:

    proc_pid_cmdline(struct task_struct *task, char * buffer)
    

    这很容易理解,但是一旦您拥有您感兴趣的进程的task_struct,您就可以使用access_process_vm()mm->arg_start 中获取您想要的位。

    【讨论】:

    • 我正在使用这个函数但是我不能访问整个 argv,只有 argv[0] :(
    • thomasbl:您正在访问整个 argv,您只是在第一个 '\0' 处停止,这是 argv[0] 的结尾 - 每个元素由 '\0' 分隔。跨度>
    • 感谢您对我的问题的正确回答!但是我昨天没有看你的答案,所以今天我自己找到了:)
    【解决方案2】:

    打开/proc/<pid>/cmdline 文件并仅读取内容有什么问题?

    【讨论】:

    • 问题是我被 open() 系统调用劫持了,如果我尝试打开 /proc/pid/cmdline 进行读取,我将陷入无限循环。
    • 你不会简单地链接系统调用吗?换句话说,在你(如此雄辩地)劫持它之前保存它的最后一个值。在这种情况下,您可以只调用旧的。
    • 否则你将不得不在你的拦截中提供所有开放的功能,而不是仅仅添加你的代码来做新的东西,让旧的东西由内核来处理。
    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 2015-06-09
    • 2023-04-10
    • 2012-08-29
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多