首页 文章

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

提问于
浏览
4

您好我在内核中使用sys_getpid()获取进程ID如何从内核结构中找到进程名?它存在于内核中吗?

非常感谢

4 回答

  • 0

    struct task_struct包含一个名为comm的成员,它包含 executable name excluding path .

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

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

  • 0

    我的内核模块加载了“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-> arg_start中的第一个字符串 - 以满足您的需要 .

  • 13

    不确定,但find_task_by_pid_ns可能有用 .

  • 1

    你可以看一下 /proc/<pid>/ 中的特殊文件

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

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

相关问题