Linux驱动中获取用户态调用进程PID的正确方式是什么?
在Linux驱动中获取与getpid()一致的用户态PID
核心结论
要在内核中获取和用户态getpid()系统调用完全一致的PID,直接调用内核函数task_tgid_vnr(current)即可,这是内核原生提供的、和getpid()实现逻辑完全对齐的方法。
内核与用户态PID概念的区别
- 内核里
struct task_struct的pid字段:对应用户态的线程ID(TID),每个线程(包括主线程)都有唯一的pid,可通过用户态gettid()获取。 - 内核里
struct task_struct的tgid字段:对应用户态的进程ID(PID),即线程组ID。一个进程的所有线程共享同一个tgid,等于主线程的pid。
为什么要用task_tgid_vnr()
用户态getpid()系统调用的最终实现,就是调用task_tgid_vnr(current)返回结果。这个函数的作用是把内核内部的struct pid类型(current->tgid是该类型的指针)转换为用户态可见的数值型PID,完全匹配用户态getpid()的返回值。
驱动中使用的示例代码
#include <linux/sched.h> // 在驱动函数中获取调用进程的用户态PID pid_t user_space_pid = task_tgid_vnr(current);
注意事项
- 不要直接使用
current->pid,它返回的是线程ID,和用户态PID不符。 - 不要直接解引用
current->tgid(它是指针类型),必须通过task_tgid_vnr()转换为数值。
内容的提问来源于stack exchange,提问作者Jisung Kim
相关产品推荐
相关产品推荐

