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