Sag*_*ain 11 linux pointers linux-kernel
当我经历了Linux字符设备驱动程序代码的下方块,我发现结构的指针current
在printk
.
我想知道current
指向的结构及其完整元素.
这种结构有什么用途?
ssize_t sleepy_read (struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
printk(KERN_DEBUG "process %i (%s) going to sleep\n",
current->pid, current->comm);
wait_event_interruptible(wq, flag != 0);
flag = 0;
printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Rah*_*thi 20
它是指向当前进程的指针,即发出系统调用的进程.
来自文档:
当前进程
尽管内核模块不像应用程序那样按顺序执行,但内核执行的大多数操作都与特定进程相关.内核代码可以通过访问全局项目current来了解驱动它的当前进程,这是一个指向struct task_struct的指针,该指针从内核版本2.4开始被声明
<asm/current.h>
,包括在内<linux/sched.h>
.当前指针指的是当前正在执行的用户进程.在执行系统调用(例如打开或读取)期间,当前进程是调用该调用的进程.如果需要,内核代码可以使用current来使用特定于进程的信息.在第5章"增强型字符驱动程序操作"中的"设备文件上的访问控制"中介绍了该技术的一个示例.实际上,当前不再是一个全局变量,就像在第一个Linux内核中一样.开发人员通过将其隐藏在堆栈页面中来优化对描述当前进程的结构的访问.您可以查看当前的详细信息
<asm/current.h>
.虽然您将看到的代码可能看起来很毛茸茸,但我们必须记住,Linux是一个符合SMP的系统,当您处理多个CPU时,全局变量根本不起作用.但是,实现的细节对于其他内核子系统仍然是隐藏的,并且设备驱动程序可以只包括并引用当前进程.从模块的角度来看,电流就像外部参考printk一样.模块可以在适合的任何地方引用电流.例如,以下语句通过访问struct task_struct中的某些字段来打印当前进程的进程ID和命令名:
Run Code Online (Sandbox Code Playgroud)printk("The process is \"%s\" (pid %i)\n", current->comm, current->pid);
存储在current-> comm中的命令名是当前进程正在执行的程序文件的基本名称.