我正在研究一个内核模块,我试图唯一地识别每个试图打开()模块的用户(可以是进程或线程)。
识别它们的最佳方法是什么?我可以从系统调用中获得一个 ID 吗?
我希望将所有用户放在一个列表中,该列表指定他们是否尝试打开模块进行读/写,并且我需要知道哪个用户尝试了操作。
我正在研究一个内核模块,我试图唯一地识别每个试图打开()模块的用户(可以是进程或线程)。
识别它们的最佳方法是什么?我可以从系统调用中获得一个 ID 吗?
我希望将所有用户放在一个列表中,该列表指定他们是否尝试打开模块进行读/写,并且我需要知道哪个用户尝试了操作。
我假设您正在创建一个简单的 Linux字符设备,将在/dev/mydev等位置创建。如果是这种情况,那么下面应该给你一个很好的例子来说明如何做到这一点。但是,如果您对open a device有不同的含义,那么这将不适用。
struct file_operations mydev_fops = {
.open = mydev_open,
};
static int mydev_open(struct inode *inode, struct file *filp)
{
pid_t pid;
int user_id;
/* This is the thread-ID, traditional PID is found in current->pgid */
pid = current->pid;
/* The current user-id (as of 2.6.29) */
user_id = current_uid();
}
有关您可以找到有关当前进程的更多信息,请查看头文件include/linux/cred.h。
您可以根据自己的要求决定唯一的含义:唯一元组可能只包含 (pid)。或者它可以是 (tid, uid) 或 (filp) 或 (inode)。
当您的open
方法被调用时,current
将指向task_struct
正在调用它的任务(~= 线程)。
不过,这很少是正确的方法。