已知进程使用的Linux内核头文件结构体,如何获取对应进程的PID
基于
struct task_cputime_atomic查找对应进程PID的方法 首先明确struct task_cputime_atomic是Linux内核用于原子化记录进程CPU时间统计的结构体,它直接内嵌在每个进程的struct signal_struct中,所有进程/内核线程的描述符都包含该结构体的实例,不存在“部分进程使用”的情况。如果你是持有某一个struct task_cputime_atomic的内存地址,需要反向查找所属进程的PID,可以按以下场景操作:
场景1:内核态调试/内核模块开发
- 利用
container_of宏反向寻址:该结构体是struct signal_struct的cputime_atomic成员,首先通过结构体地址计算得到所属的struct signal_struct指针,再持有tasklist_lock锁遍历系统所有task_struct实例,比对task->signal指针是否匹配,匹配项的pid字段即为目标PID。 - 用crash/kGDB调试:如果是分析崩溃镜像或者在线调试内核,直接用调试工具的内存搜索命令定位到该结构体地址,再关联到所属的
task_struct即可直接导出PID。
场景2:用户态筛选匹配CPU时间的进程
如果你需要找的是和struct task_cputime_atomic记录的CPU时间值匹配的进程,不需要内核权限,直接读取procfs即可:
- 每个进程的CPU时间统计都存在
/proc/[pid]/stat文件中,其中第14、15字段分别对应用户态、内核态运行总时间,和struct task_cputime_atomic的统计值同源,你可以根据目标时间值遍历所有PID的stat文件筛选匹配项即可。
注意:在内核态遍历进程链表时必须持有
tasklist_lock读写锁,避免并发修改导致的空指针访问或者数据错位问题。
内容的提问来源于stack exchange,提问作者ales
相关产品推荐
相关产品推荐

