linux从内核中的pid获取进程名称

时间:2011-03-23 14:41:42

标签: linux linux-kernel

喜 我已经在内核中使用了sys_getpid()来获取进程ID 如何从内核结构中找出进程名称?它存在于内核吗?

非常感谢

4 个答案:

答案 0 :(得分:13)

struct task_struct包含名为comm的成员,其中包含executable name excluding path

获取current macro from this file将获取启动当前进程的程序的名称(如insmod / modprobe中所示)。

使用以上信息,您可以使用获取名称信息。

答案 1 :(得分:1)

我的内核模块加载了“modprobe -v my_module --allow-unsupported -o some-data”,我提取了“some-data”参数。下面的代码给了我整个命令行,以下是我如何解析出感兴趣的参数:

struct mm_struct *mm;
unsigned char x, cmdlen;

mm = get_task_mm(current);
down_read(&mm->mmap_sem);

cmdlen = mm->arg_end - mm->arg_start;
for(x=0; x<cmdlen; x++) {
    if(*(unsigned char *)(mm->arg_start + x) == '-' && *(unsigned char *)(mm->arg_start + (x+1)) == 'o') {
        break;
    }
}
up_read(&mm->mmap_sem);

if(x == cmdlen) {
    printk(KERN_ERR "inject: ERROR - no target specified\n");
    return -EINVAL;
}

strcpy(target,(unsigned char *)(mm->arg_start + (x+3)));

“target”保存-o参数后面的字符串。您可以稍微压缩一下 - 调用者(在本例中为modprobe)将是mm-&gt; arg_start中的第一个字符串 - 以满足您的需求。

答案 2 :(得分:0)

不确定,但find_task_by_pid_ns可能有用。

答案 3 :(得分:0)

您可以查看/proc/<pid>/

中的特殊文件

例如,/proc/<pid>/exe是指向实际二进制文件的符号链接。

/proc/<pid>/cmdline是命令行的以空分隔的列表,因此第一个单词是进程名称。