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

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

在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 内核的工作原理非常有帮助。


http://www.kler.cn/a/600744.html

相关文章:

  • 传统 embedding vs. P-Tuning 里的 embedding
  • (二)手眼标定——概述+原理+常用方法汇总+代码实战(C++)
  • 稳定运行的以Microsoft Azure Cosmos DB数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • 深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置
  • 【蓝桥杯每日一题】3.25
  • MySQL数据库中常用的命令
  • 竞品已占据市场先机,如何找到差异化突破口
  • Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927)
  • showdoc在服务器docker部署后如何关闭注册功能
  • XSS复现漏洞简单前八关靶场
  • 余弦退火算法与学习率预热
  • 依肤婗:以科研实力引领 问题性肌肤护理新标准
  • Apache HBase平衡器架构
  • 16种二极管综合对比——《器件手册--二极管》
  • JAVA学习*String类
  • 解密Java内存模型:从happens-before原则到实战可见性问题
  • Java全栈项目 - 智能停车场管理系统(2)
  • 《基于SpringBoot的图书网购平台的设计与实现》开题报告
  • Go语言中context.Context的
  • Rust从入门到精通之精通篇:22.Unsafe Rust 详解