当前位置: 首页 > news >正文

linux 内核: 遍历当前所有进程

一:概述

        在 Linux 内核中,每个进程都由一个 task_struct 结构体表示,它是内核中用于描述进程和线程的核心数据结构。内核通过一个全局链表维护所有的进程信息,for_each_process(p) 宏可用于遍历该链表中的所有进程。由于进程链表是全局共享资源,若不加锁直接访问,可能导致读取到无效数据甚至系统崩溃。传统的 read_lock(&tasklist_lock) 机制在现代内核中已被废弃或不对模块导出。因此,本示例使用 RCU(Read-Copy-Update)机制对进程链表进行并发安全的读取操作。        

二: 实现

        1. 加锁(RCU)   

rcu_read_lock()

        遍历进程链表是读访问共享数据,需要加锁。这里使用的是RCU读锁(Read-Copy-Update),是Linux内核中一种轻量、高效的读保护机制,因为老 tasklist_lock不对模块导出(不能直接用) ,所以推荐用rcu_read_lock() / rcu_read_unlock() 保护task_struct 的代码。

        2. 遍历进程

for_each_process(p) 

        for_each_process(p) 是一个宏,用于遍历系统中所有进程的 task_struct 链表,p 是当前进程的指针。

        3. 打印每个进程信息

get_task_struct(p);   // 增加引用计数,防止进程被销毁
n = snprintf_lkp(tmp, 128, "%-16s|%8d|%8d|%7u|%7u\n",p->comm, p->tgid, p->pid,__kuid_val(p->cred->uid), __kuid_val(p->cred->euid));
put_task_struct(p);   // 释放引用
pr_info("%s", tmp);

          get_task_struct()put_task_struct() 是对 task_struct 增减引用计数的 API,保证遍历期间该进程结构不会被释放。

     4. 解锁

rcu_read_unlock();

三:完整例子 

#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>  // for_each_process
#include <linux/cred.h>          // __kuid_val
#include <linux/rcupdate.h>      // rcu_read_lock/unlockMODULE_AUTHOR("MyName");
MODULE_DESCRIPTION("List all processes in task list");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0");static int show_all_processes(void)
{struct task_struct *p;char buf[128];int total = 0;pr_info("     Name       |  TGID  |  PID   |  RUID  |  EUID\n");rcu_read_lock();for_each_process(p) {snprintf(buf, sizeof(buf), "%-16s|%8d|%7d|%7u|%7u\n",p->comm,p->tgid,p->pid,__kuid_val(p->cred->uid),__kuid_val(p->cred->euid));pr_info("%s", buf);total++;}rcu_read_unlock();return total;
}static int __init prcs_showall_init(void)
{int count = show_all_processes();pr_info("Total processes: %d\n", count);return 0;
}static void __exit prcs_showall_exit(void)
{pr_info("Module removed\n");
}module_init(prcs_showall_init);
module_exit(prcs_showall_exit);

  

http://www.lryc.cn/news/589184.html

相关文章:

  • 演示扩展卡尔曼滤波在无人驾驶多传感器融合中的应用
  • Wiz笔记二次开发
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • 可微分3D高斯溅射(3DGS)在医学图像三维重建中的应用
  • vllm本地部署qwen3-4b
  • 2.【C# in .NET】探秘数据类型:从底层机制到实战启示
  • 简单2步配置CadenceSkill开发编辑器,支持关键字高亮
  • 正则表达式使用示例
  • Ajax接收java后端传递的json对象包含长整型被截断导致丢失精度的解决方案
  • Flink SQL 性能优化实战
  • Nginx的反向代理
  • 光米投影 多余之物的本思
  • IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790
  • 服务器上PHP环境安装与更新版本和扩展(安装PHP、Nginx、Redis、Swoole和OPcache)
  • 26.将 Python 列表拆分为多个小块
  • 22.计算指定范围内数字的幂次和
  • 【c++】在const成员函数中使用mutex
  • CCF-GESP 等级考试 2025年6月认证Python四级真题解析
  • 【时时三省】(C语言基础)通过指针引用多维数组
  • mac上的app如何自动分类
  • MongoDB 数据库 启用访问控制
  • GitHub 上 Star 数量前 8 的开源 Web 应用项目
  • AI大模型开发架构设计(22)——LangChain的大模型架构案例实战
  • 飞搭系列 | 子事件流节点,让逻辑复用更简单!
  • error: #147: declaration is incompatible with错误解决
  • 从OSI到TCP/IP:Linux网络架构深度解析
  • 【15】MFC入门到精通——MFC弹窗提示 MFC关闭对话框 弹窗提示 MFC按键触发 弹窗提示
  • OpenCV图像自动缩放(Autoscaling)函数autoscaling()
  • 如何加固Web服务器的安全?
  • Volo-HTTP 0.4.0发布:正式支持 HTTP/2,客户端易用性大幅提升!