在内核模块中使用current宏

在Linux平台下,每一个进程都有一个task_struct数据结构,用来存储该进程的相关信息。task_struct在内核的以下代码中定义(以2.6.36为例,其他类似):http://lxr.linux.no/linux+v2.6.27/include/linux/sched.h。

task_struct最简单的两个成员,其他的这里就不再介绍了:
进程名称
点击隐藏
C CODE1153
1154
1155
1156            char comm[TASK_COMM_LEN]; /* executable name excluding path
                                     - access with [gs]et_task_comm (which lock
                                       it with task_lock())
                                     - initialized normally by flush_old_exec */

进程号
点击隐藏
C CODE1091            pid_t pid;

在内核模块中,可以通过调用current来获取当前进程的task_struct数据结构,调用方式如下:
点击隐藏
C CODE1    printf("Task name: %s, task ID: %d\n", current->comm, current->pid);

current是在中定义的:
点击隐藏
C CODE1
2
3
4
5
6
7
8
9
10    #ifndef __ASM_GENERIC_CURRENT_H
#define __ASM_GENERIC_CURRENT_H
#include <linux /thread_info.h>
#define get_current() (current_thread_info()->task)
#define current get_current()
#endif /* __ASM_GENERIC_CURRENT_H */
</linux>

所以在调用current之前,需要首先包含该头文件,但是需要注意的是,如果只包含该头文件,程序就会在链接的过程中出现以下错误:
dereferencing pointer to incomplete type
错误位置就在current调用的时候。原因很简单但是大家却容易忽略,就是current只是一个宏定义而已,实际执行还是由task_struct结构体来完成,没有包含结构体task_struct的定义,自然就会出现“定义不完全”的错误了。所以在调用之前需要包含<linux/sched.h>头文件,其中包含task_struct结构体的定义。
完整的current使用方法如下:
点击隐藏
C CODE1
2
3
4
5
6
7
8    #include <asm -generic/current.h>
#include <linux /sched.h>
void show_current(void)
{
printf("Task name: %s, task ID: %d\n", current->comm, current->pid);
}
</linux></asm>

这样,我们就可以通过current获取当前进程的所有信息了。

转载于:https://www.cnblogs.com/ZJoy/archive/2011/01/09/1931233.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值