喜 我已经在内核中使用了sys_getpid()来获取进程ID 如何从内核结构中找出进程名称?它存在于内核吗?
非常感谢
答案 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
是命令行的以空分隔的列表,因此第一个单词是进程名称。