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

内核编程十二:打印内核态进程的属性

在Linux内核中,current 是一个宏,用于获取当前正在执行的进程的 task_struct 结构体指针。current 宏返回一个指向当前正在运行的进程的 task_struct 结构体的指针。通过这个指针,内核代码可以访问和修改当前进程的各种属性和状态。

打印单个进程信息

通过current 打印当前 CPU 上正在运行的进程的相关信息:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>	/* current() */
#include <linux/preempt.h>	/* in_task() */
#include <linux/cred.h>		/* current_{e}{u,g}id() */
#include <linux/uidgid.h>	/* {from,make}_kuid() */

MODULE_AUTHOR("<insert your name here>");
MODULE_DESCRIPTION("print process desc");
MODULE_LICENSE("Dual MIT/GPL");
MODULE_VERSION("0.1");

static int __init print_process(void)
{
	struct task_struct *current_task = current;
	printk(KERN_INFO "Current process: %s (pid: %d)\n", current_task->comm, current_task->pid);
	printk(KERN_INFO "Current process prio: %d\n", current_task->prio);
	printk(KERN_INFO "Current process on_cpu: %d\n", current_task->on_cpu);
	printk(KERN_INFO "Current process recent_used_cpu: %d\n", current_task->recent_used_cpu);
	printk(KERN_INFO "Current process wake_cpu: %d\n", current_task->wake_cpu);
	printk(KERN_INFO "Current process static_prio: %d\n", current_task->static_prio);
	printk(KERN_INFO "Current process numa_scan_seq: %d\n", current_task->numa_scan_seq);
	printk(KERN_INFO "Current process exit_code: %d\n", current_task->exit_code);
	printk(KERN_INFO "Current process exit_state: %d\n", current_task->exit_state);
	return 0;		/* success */
}

static void __exit print_process_exit(void)
{
	printk(KERN_INFO "Goodbye, world\n");
}

module_init(print_process);
module_exit(print_process_exit);

遍历进程

通过 init_tasktask_struct 头节点)遍历所有进程:

struct task_struct *task;
for_each_process(task) {
    printk(KERN_INFO "Process: %s (PID: %d)\n", task->comm, task->pid);
}

#include <linux/sched/signal.h>  // 提供 for_each_process 和相关进程遍历宏 

current 宏是 Linux 内核中一个非常重要的工具,它使得内核代码能够方便地访问和操作当前进程的信息。理解 current 宏的实现和使用方式对于深入理解 Linux 内核的工作原理非常有帮助。

相关文章:

  • 初级:集合框架面试题精讲
  • Qt开发:QInputDialog的使用
  • AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道
  • MySQL 对text类型字段添加索引
  • 【RISC-V CPU debug 专栏 4.1 -- RISCV CSR C 内嵌汇编访问介绍】
  • Java虚拟机面试题:内存管理(下)
  • 深度学习入门之基于MLP的加州房价预测模型
  • DeepSeek 发布DeepSeek-V3-0324 版本 前端与网页开发能力、推理与多任务能力提升
  • 2.5 Gannt图【甘特图】
  • 树莓派温湿度监测终极指南:DHT11+wiringPi驱动深度解析
  • djinn: 1靶场渗透测试
  • gdb: Invalid disassembly modifier
  • 宝塔面板安装docker flarum失败,请先安装依赖应用: [‘mysql‘]:5/8
  • 平台体系如何搭建?贝锐向日葵发布企业技术支持解决方案白皮书
  • JavaEE企业级开发 延迟双删+版本号机制(乐观锁) 事务保证redis和mysql的数据一致性 示例
  • 使用AI一步一步实现若依(23)
  • 什么是「Agentic 工作流程」?丨社区来稿
  • Springboot 学习 之 Shardingsphere 按照日期水平分表(二)
  • c++ map和vector模板类
  • mysql创建库表插入数据演示
  • 淘宝做网站价格/找文网客服联系方式
  • 做毕业设计网站需要的工具/郑州seo顾问外包
  • 淘宝客个人网站建设/网络推广费用大概价格
  • 网站做简介/百度大搜
  • 格泰网站建设/深圳全网营销系统
  • 建设一个导航网站/全网推广软件