linux内核获取进程的全路径3种方法
来源:互联网 发布:java数组输出空格 编辑:程序博客网 时间:2024/05/09 03:45
本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性。
/*----------------------------------------------------------------------------------------------------------------------------*/
在linux内核获取进程全路径方式类似Windows内核获取进程路径,方法多样。但是由于linux设计地特点,没有一个很好的方法来直接获取路径:进程是动态执行体,其没有物理位置的概念,严格于程序的概念区分开来。但是否就无法获取linux内核进程全路径了呢?答案当然是否定的。
task_struct结构中有一comm子段,里面存储着程序的名称,而且名称最大是16(Windows 的 EPROCESS里面的ImageName也是16位,哪个先提出来的?!!)但是不包括路径名称。从task_struct获取路径基本就是靠mm_struct这个结构了,从中可以获取进程全路径。
在linux内核据我个人掌握的方法有3种,这里一一说明。
1 通过exe_file
task_struct->mm->exe_file->f_path可获取全路径。
但是此方法有限制,内核必须启用PROC_FS。而一般发行版都是去掉这个选项的。因此不重新编译内核基本无法使用,否则机器就要当了。
2 通过arg_xxx的进程参数内存
task_struct->mm->arg_start ~ arg_end 之间内存存储进程的参数,当然也包括了程序的全路径。
但是此方法也有限制,一般发行版中似乎都把这部分内容抹去了。我在自己编译的内核中可以获取,但是在发行版中就无法获取到内容。此处很奇怪。
static void util_get_task_name(pid_t pid)
{
struct task_struct *task = find_task_by_vpid(pid);
if(task != NULL)
{
char *name = kzalloc(PATH_MAX, ATOM);
char *buffer = NULL;
struct mm_struct *mm = get_task_mm(task);
int len = 0;
unsigned long address = 0;
if(!name || !mm)
goto out;
down_read(&mm->mmap_sem);
len = mm->arg_end - mm->arg_start;
address = mm->arg_start;
buffer = name;
while(len)
{
void *maddr = NULL;
struct page *page = NULL;
struct vm_area_struct *vma = NULL;
int bytes = 0, offset = 0;
int ret = get_user_pages(task, mm, address, 1, 0, 1, &page, &vma);
if(ret <= 0)
{
bytes = ret;
goto next;
}
bytes = len;
offset = address & (PAGE_SIZE-1);
if (bytes > PAGE_SIZE-offset)
bytes = PAGE_SIZE - offset;
maddr = kmap(page);
copy_from_user_page(vma, page, address, buffer, maddr + offset, bytes);
kunmap(page);
page_cache_release(page);
next:
len -= bytes;
address += bytes;
buffer += bytes;
}
up_read(&mm->mmap_sem);
mmput(mm);
printk("xxxxxxxxxxxxx: name = %s, len = %d\n", name, len);
}
out:
if(name) kfree(name);
return;
}
3 通过vm_area_struct
task_struct->mm->mmap,这里需要检查检查影射的内存是代码段属性(VM_EXECUTABLE)。获取的进程对应的程序的文件名称不包含路径。
要想获取全路径,需要向上查找父路径,最后拼凑起来全路径。
- linux内核获取进程的全路径3种方法
- linux内核中得到进程全路径
- 获取进程全路径
- 获取进程全路径
- Linux下获取程序绝对路径(全路径)的方法
- NT6上的获取进程全路径
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法 [原]
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- [转载]在2000下获取进程的全路径
- 如何获取进程/目标对象的全路径?
- NT5/NT6上的获取进程全路径
- 获取linux进程的执行文件路径
- Windows驱动获得当前进程全路径的方法
- 在驱动中获取进程全路径
- unity3d 联网 SecurityException
- js 添加到收藏和设置主页
- c#连接MySql数据库的两种方法
- 2.hql查询实体:工具类
- JS 无法清除Cookie以及2个页面出现相同key,值不一样的解决方法
- linux内核获取进程的全路径3种方法
- 又见一帘幽梦
- 3.hql查询实体:hibernate.cfg.xml
- Android广播机制
- android之listview的item不可点击
- android 设置默认输入法
- SQL SERVER 2005 ROLLUP
- 4.hql查询实体:测试
- ROS2.9.27架设VPN方法及ADSL路由器与网吧构建VPN虚拟专用网络应用