Linux 如何在内核中获取当前用户,即如何调用current->;正确的方法

Linux 如何在内核中获取当前用户,即如何调用current->;正确的方法,linux,linux-kernel,kernel,procfs,Linux,Linux Kernel,Kernel,Procfs,我正在写一个可加载内核模块(LKM)。如果刚刚执行cat/proc/的用户是当前用户,那么LKM需要做一些特殊的事情。所以我想知道如何找到这些信息。我的第一次尝试是使用cred.h中定义的get_current_user()。但这是行不通的。我不想寻找其他方法这是我所发现的没有一种方法是有效的 有关职能: static int getuid() { return get_current_user()->uid; } gcc输出: make -C /lib/modules/2.6.3

我正在写一个可加载内核模块(LKM)。如果刚刚执行cat/proc/的用户是当前用户,那么LKM需要做一些特殊的事情。所以我想知道如何找到这些信息。我的第一次尝试是使用cred.h中定义的get_current_user()。但这是行不通的。我不想寻找其他方法这是我所发现的没有一种方法是有效的

有关职能:

static int  getuid()
{
 return get_current_user()->uid;
}
gcc输出:

make -C /lib/modules/2.6.32-358.11.1.el6.x86_64/build M=/root/git_prj1 modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64'
  CC [M]  /root/git_prj1/proc_setup.o
/root/git_prj1/proc_setup.c:37: warning: function declaration isn���t a prototype
/root/git_prj1/proc_setup.c: In function ���getuid���:
/root/git_prj1/proc_setup.c:39: error: dereferencing pointer to incomplete type
/root/git_prj1/proc_setup.c:39: error: implicit declaration of function ���get_uid���
/root/git_prj1/proc_setup.c:39: warning: assignment makes pointer from integer without a cast
/root/git_prj1/proc_setup.c:39: warning: return makes integer from pointer without a cast
/root/git_prj1/proc_setup.c: In function ���read_key���:
/root/git_prj1/proc_setup.c:52: warning: format ���%s��� expects type ���char *���, but argument 4 has type ���int���
make[2]: *** [/root/git_prj1/proc_setup.o] Error 1
make[1]: *** [_module_/root/git_prj1] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64'
make: *** [all] Error 2

因为我看不到你的代码的全部源代码,所以我不能确切地说什么是错的

然而,我编写了一个快速演示,并设法让它相当容易地工作。我怀疑你只是在你所有的代码中缺少了一个标题

danieltang@danieltang-virtual-machine:~/test_module$ cat test.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/cred.h>

static int test_init(void)
{
    printk(KERN_INFO "Current UID = %u\n",
        get_current_user()->uid);

    return 0;
}

static void test_exit(void)
{
}

module_init(test_init);
module_exit(test_exit);
danieltang@danieltang-virtual-machine:~/test_module$ make
make -C /lib/modules/3.5.0-17-generic/build  M=/home/danieltang/test_module   modules  
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
Building with KERNELRELEASE = 3.5.0-17-generic
  Building modules, stage 2.
Building with KERNELRELEASE = 3.5.0-17-generic
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
danieltang@danieltang-virtual-machine:~/test_module$ sudo insmod test.ko
danieltang@danieltang-virtual-machine:~/test_module$ dmesg | tail -n1
[ 3705.237507] Current UID = 0
danieltang@danieltang-virtual-machine:~/test_module$ 
danieltang@danieltang-虚拟机:~/test\u模块$cat test.c
#包括
#包括
#包括
#包括
#包括
静态int测试_init(无效)
{
printk(内核信息“当前UID=%u\n”,
获取当前用户()->uid);
返回0;
}
静态空隙试验_出口(空隙)
{
}
模块初始化(测试初始化);
模块退出(测试退出);
danieltang@danieltang-虚拟机:~/test\u模块$make
make-C/lib/modules/3.5.0-17-generic/build M=/home/danieltang/test_模块
make[1]:输入目录“/usr/src/linux-headers-3.5.0-17-generic”
使用KERNELRELEASE=3.5.0-17-generic构建
构建模块,第2阶段。
使用KERNELRELEASE=3.5.0-17-generic构建
MODPOST 1模块
make[1]:离开目录“/usr/src/linux-headers-3.5.0-17-generic”
danieltang@danieltang-虚拟机:~/test\u模块$sudo insmod test.ko
danieltang@danieltang-虚拟机:~/test_模块$dmesg | tail-n1
[3705.237507]当前UID=0
danieltang@danieltang-虚拟机:~/test\u模块$

由于我看不到您的代码的完整源代码,所以我无法确切说出错误所在

然而,我编写了一个快速演示,并设法让它相当容易地工作。我怀疑你只是在你所有的代码中缺少了一个标题

danieltang@danieltang-virtual-machine:~/test_module$ cat test.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/cred.h>

static int test_init(void)
{
    printk(KERN_INFO "Current UID = %u\n",
        get_current_user()->uid);

    return 0;
}

static void test_exit(void)
{
}

module_init(test_init);
module_exit(test_exit);
danieltang@danieltang-virtual-machine:~/test_module$ make
make -C /lib/modules/3.5.0-17-generic/build  M=/home/danieltang/test_module   modules  
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
Building with KERNELRELEASE = 3.5.0-17-generic
  Building modules, stage 2.
Building with KERNELRELEASE = 3.5.0-17-generic
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
danieltang@danieltang-virtual-machine:~/test_module$ sudo insmod test.ko
danieltang@danieltang-virtual-machine:~/test_module$ dmesg | tail -n1
[ 3705.237507] Current UID = 0
danieltang@danieltang-virtual-machine:~/test_module$ 
danieltang@danieltang-虚拟机:~/test\u模块$cat test.c
#包括
#包括
#包括
#包括
#包括
静态int测试_init(无效)
{
printk(内核信息“当前UID=%u\n”,
获取当前用户()->uid);
返回0;
}
静态空隙试验_出口(空隙)
{
}
模块初始化(测试初始化);
模块退出(测试退出);
danieltang@danieltang-虚拟机:~/test\u模块$make
make-C/lib/modules/3.5.0-17-generic/build M=/home/danieltang/test_模块
make[1]:输入目录“/usr/src/linux-headers-3.5.0-17-generic”
使用KERNELRELEASE=3.5.0-17-generic构建
构建模块,第2阶段。
使用KERNELRELEASE=3.5.0-17-generic构建
MODPOST 1模块
make[1]:离开目录“/usr/src/linux-headers-3.5.0-17-generic”
danieltang@danieltang-虚拟机:~/test\u模块$sudo insmod test.ko
danieltang@danieltang-虚拟机:~/test_模块$dmesg | tail-n1
[3705.237507]当前UID=0
danieltang@danieltang-虚拟机:~/test\u模块$

在函数中,您将返回get\u current\u user()->uid作为int返回类型。但实际上它是无符号的int类型,可能是它导致了问题。

在函数中,您将get\u current\u user()->uid作为int返回类型返回。但实际上它是unsigned int类型,可能是它导致了一个问题。

什么不起作用?好吧,给我们看看你的代码,告诉我们你遇到了什么错误。用错误代码更新。导致错误的src已经包含在内了。您可能希望发布完整的源代码,或者至少发布一个不起作用的真正精简版本。你有很多警告和错误,没有人知道它们对应什么,因为我们看不到代码。什么不起作用意味着什么?好吧,给我们看看你的代码,告诉我们你遇到了什么错误。用错误代码更新。导致错误的src已经包含在内了。您可能希望发布完整的源代码,或者至少发布一个不起作用的真正精简版本。你有很多警告和错误,没有人能说出它们对应什么,因为我们看不到代码。1。它是sched.h。2.从v3.5开始获取当前用户()->uid.val,而不是获取当前用户()->uid.1。它是sched.h。2.从v3.5开始获取当前用户()->uid.val,而不是获取当前用户()->uid。