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

内核编程十二:打印task_struct中的数据

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

相关文章:

  • 高性能C#定时删除图片,包含定时触发、分批删除、异步处理和资源监控
  • JavaScript基础-常用的鼠标事件
  • 卷积神经网络的原理、实现及变体
  • c语言基础编程入门练习题(三)
  • 工欲善其事必先利其器————idea插件
  • 11_JavaScript_字符串方法+数学方法
  • react中防止数据多大并需要二次加工处理进行单线程转多线程webworker优化处理(不借助react-webworker)
  • Python Sanic面试题及参考答案
  • 东软鸿蒙C++开发面经
  • 网络华为HCIA+HCIP 防火墙
  • VLAN综合实验实验报告
  • git的进阶使用
  • Spring Boot JSON序列化深度管控:忽略指定字段+Jackson扩展策略破解双向实体循环引用问题
  • Linux -- 进程间通信(IPC)-- 进程间通信、管道、system V 共享内存、system V 消息队列、责任链模式 、system V 信号量
  • AI与数据的双向奔“赋”
  • 超融合服务器与普通服务器的具体区别
  • 226.翻转二叉树
  • ubuntu20.04 修改输入法设置后 界面卡死终端乱码 解决方法
  • 23中设计模式-迭代器(Iterator)设计模式
  • Netty源码—Pipeline和Handler(二)
  • 中小企业网站开发/专业网络推广公司排名
  • 做网络推广选择哪个网站好/百度推广代理商返点
  • wordpress子站点/绍兴seo优化
  • 做网站图结构/网络推广与网络营销的区别
  • 真人做爰直播视频网站/网站排名系统
  • 广告网站怎么做/今日资讯最新消息