内核编程十二:打印内核态进程的属性
在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_task
(task_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 内核的工作原理非常有帮助。