linux 内核获取进程全路径,linux内核获取进程的全路径3种方法【转】

本文档的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)。获取的进程对应的程序的文件名称不包含路径。

要想获取全路径,需要向上查找父路径,最后拼凑起来全路径。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt框架下,可以使用Linux系统提供的接口获取指定进程的CPU使用率。 一常用的方法是使用proc文件系统。在Linux系统中,每个进程都有一个以进程ID为名称的文件夹,可以在`/proc`目录下找到。通过读取该文件夹下的stat文件,可以获取到该进程的一些信息,包括CPU使用情况。 首先,需要得到目标进程进程ID。可以通过Qt提供的QProcess类来启动一个命令行程序`ps`,并指定合适的参数来获取进程ID。使用QProcess的readAllStandardOutput()函数可以读取到命令行程序的输出结果。从输出结果中解析出目标进程进程ID。 接下来,可以打开目标进程的stat文件,路径为`/proc/进程ID/stat`。使用ifstream读取该文件,可以获取到文件中的内容。 stat文件的内容由多个字段组成,字段之间以空格分隔。第14个字段为进程在用户态运行的时间,第15个字段为进程内核态运行的时间。可以将这两个字段的值相加,得到进程总共运行的时间。 然后,可以通过读取/proc目录下的stat文件,获取到系统运行的总时间。系统运行总时间的信息位于/proc目录下的stat文件的第1个字段。 最后,计算出目标进程的CPU使用率。将目标进程的总运行时间除以系统的总运行时间,再乘以100即可得到百分比形式的CPU使用率。 需要注意的是,在读取/proc目录下的文件时,需要以root权限运行程序,或者将程序的用户权限设置为root,以便访问这些敏感信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值