您好我在内核中使用sys_getpid()获取进程ID如何从内核结构中找到进程名?它存在于内核中吗?
非常感谢
struct task_struct包含一个名为comm的成员,它包含 executable name excluding path .
executable name excluding path
获取current macro from this file将获取启动当前进程的程序的名称(如insmod / modprobe中所示) .
使用以上信息,您可以使用获取名称信息 .
我的内核模块加载了“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中的第一个字符串 - 以满足您的需要 .
不确定,但find_task_by_pid_ns可能有用 .
你可以看一下 /proc/<pid>/ 中的特殊文件
/proc/<pid>/
例如, /proc/<pid>/exe 是指向实际二进制文件的符号链接 .
/proc/<pid>/exe
/proc/<pid>/cmdline 是命令行的以空分隔的列表,因此第一个单词是进程名称 .
/proc/<pid>/cmdline
4 回答
struct task_struct包含一个名为comm的成员,它包含
executable name excluding path
.获取current macro from this file将获取启动当前进程的程序的名称(如insmod / modprobe中所示) .
使用以上信息,您可以使用获取名称信息 .
我的内核模块加载了“modprobe -v my_module --allow-unsupported -o some-data”,我提取了“some-data”参数 . 下面的代码给了我整个命令行,这是我如何解析出感兴趣的参数:
“target”保存-o参数后面的字符串 . 您可以稍微压缩一下 - 调用者(在本例中为modprobe)将是mm-> arg_start中的第一个字符串 - 以满足您的需要 .
不确定,但find_task_by_pid_ns可能有用 .
你可以看一下
/proc/<pid>/
中的特殊文件例如,
/proc/<pid>/exe
是指向实际二进制文件的符号链接 ./proc/<pid>/cmdline
是命令行的以空分隔的列表,因此第一个单词是进程名称 .