【问题标题】:Full process name from task_struct来自 task_struct 的完整进程名称
【发布时间】:2013-09-10 14:01:52
【问题描述】:

我想从struct task_struct 获取完整的进程名称。 comm 字段仅存储 16 个字符,而进程名称可以更长。有没有办法获得完整的进程名称?
这可以通过从task_struct获取struct vm_area_struct来完成,并进一步获取vm_area映射到的文件,但这并不可靠。

【问题讨论】:

  • 不可靠吗?这正是 proc 文件系统在 /proc/<pid>/exe 中返回路径所执行的操作。在内核源代码中搜索proc_exe_link

标签: linux process kernel


【解决方案1】:

你是说exe文件名吗?您可以通过以下方式获取当前进程的exe:

char *pathname,*p;
mm = current->mm;
if (mm) {
    down_read(&mm->mmap_sem);
    if (mm->exe_file) {
                pathname = kmalloc(PATH_MAX, GFP_ATOMIC);
                if (pathname) {
                      p = d_path(&mm->exe_file->f_path, pathname, PATH_MAX);
                    /*Now you have the path name of exe in p*/
                }
            }
    up_read(&mm->mmap_sem);
}

【讨论】:

    【解决方案2】:

    只需使用current->comm 即可看到名称。

    例子:

    printk(KERN_ALERT "THREAD NAME = %s\n", current->comm);
    

    【讨论】:

    • 我认为反对票是因为comm[] 不是一个正确的字符串,而是一个 16 字节的字符数组,它可能不会以 '\0' 结尾。此处提供的代码存在读取越界问题,此外它没有回答 OP 的问题(16 字节限制)。
    • 我之前的评论中关于 '\0' 的终止可能是错误的。
    • 年度无意义的答案。派对迟到了六年,仍然完全没用。
    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 2013-03-10
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多