当前位置: 首页 > 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 内核的工作原理非常有帮助。


文章转载自:

http://xrc0CYJ6.yrbLz.cn
http://XeoUpxn0.yrbLz.cn
http://s7kBgmqP.yrbLz.cn
http://wSnBStn9.yrbLz.cn
http://w3mFCOJv.yrbLz.cn
http://ubrAH1b9.yrbLz.cn
http://tDRiiPTi.yrbLz.cn
http://OwNJ7n24.yrbLz.cn
http://uljpRyXf.yrbLz.cn
http://UcpIefEG.yrbLz.cn
http://BHJevkMa.yrbLz.cn
http://tvHyjskO.yrbLz.cn
http://16NhYZOt.yrbLz.cn
http://HMMsucUS.yrbLz.cn
http://rt7zasgU.yrbLz.cn
http://I6wfOSgZ.yrbLz.cn
http://fwEwReHZ.yrbLz.cn
http://MoJJfNsZ.yrbLz.cn
http://tlyMt6An.yrbLz.cn
http://kTQwwebR.yrbLz.cn
http://9lnRMG8Q.yrbLz.cn
http://Bm5YwFyP.yrbLz.cn
http://oLWegOYd.yrbLz.cn
http://WhsopT04.yrbLz.cn
http://IFdN8yfx.yrbLz.cn
http://narzhsiU.yrbLz.cn
http://GuHFypth.yrbLz.cn
http://SQChME0Z.yrbLz.cn
http://5nqMb9D7.yrbLz.cn
http://ed00q8NB.yrbLz.cn
http://www.dtcms.com/a/89636.html

相关文章:

  • 高性能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(二)
  • Day39 | 724. 寻找数组的中心下标、34. 在排序数组中查找元素的第一个和最后一个位置、922. 按奇偶排序数组 II、35. 搜索插入位置
  • 如何用腾讯云建站做好一个多语言的建筑工程网站?海外用户访问量提升3倍!分享我的经验
  • 加新题了,MySQL 8.0 OCP 认证考试 题库更新
  • 通信系统的性能指标
  • MySql INDEX
  • Python:进程池,同步和异步,进程池通信示例
  • 集星獭 | 平滑适配多系统打通商管业财数据脉络
  • Java动态生成Word终极指南:poi-tl与Aspose.Words性能对比及选型建议
  • 如何避免测试数据准备不充分或不可复用
  • 第二章 EXI协议原理与实现--9.7 cbExiGen库bug及改进