从linux内核使用lstat / stat?

时间:2015-10-23 19:40:53

标签: c linux linux-kernel symlink stat

我希望有人能够在“Centos 7中的Linux内核3.10.0可以调用lstat和/或stat”这个问题上检查我的假设。我一直在搜索和阅读尽可能多的内容。只能让自己迷惑。我不知道我发现的例子是否仅适用于内核空间或用户空间。

基本问题是,我可以从内核调用lstat或stat吗?

具体来说,我将它添加到fs目录下的exec.c中。

目标是区分符号链接或硬链接的文件,并且只是一种学习体验。

如果这是真的,我会调用lstat / stat还是“64”版本 - 如果重要的话,我会使用X86架构。

已于2015年11月18日添加 根据以下评论

// These two lines are in the original exec.c file
struct file *file;
file = do_filp_open(AT_FDCWD, &tmp, &open_exec_flags, LOOKUP_FOLLOW);


// In the open_exec function I added the following
struct stat buf;
int lstat(struct file, struct stat buf);
mm_segment_t security_old_fs;

security_old_fs = get_fs();
set_fs(KERNEL_DS);
if (lstat(*file, buf) == -)
    printk(KERN_INFO "stat error\n");
    goto exit;
}
set_fs(security_old_fs);

然后运行“make”并查看

LINK    vmlinux
LD      vmlinux.o
MODPOST vmlinux.o
GEN     .version
CHK     include/generated/compile.h
UPD     include/generated/compile.h
CC      init/version.o
D      init/built-in.o
fs/built-in.o: In function`open_exec':
/home/user/rpmbuild/SOURCES/linux-3.10.0-123.20.1.el7/fs/exec.c:946: undefined reference to `lstat'
make: *** [vmlinux] Error 1

任何指针都会有所帮助。

1 个答案:

答案 0 :(得分:2)

Linux内核中没有stat / lstat函数。

sys_stat / sys_lstat函数,它们实现相应的系统调用,但不建议在内核中调用这些函数:这些函数可能使用特殊约定来传递参数,这些约定不同于常见的约定在内核中。

实际上,有vfs_stat函数,由sys_stat调用,并且工作最多。请注意,此函数要求文件名称位于用户空间中的 。要使用内核分配文件名的此函数,可以使用set_fs方法:

int my_stat(const char* name, struct kstat* stat)
{
    int res;
    mm_segment_t security_old_fs;

    security_old_fs = get_fs();
    set_fs(KERNEL_DS);

    res = vfs_stat((const char __user *)name, stat);

    set_fs(security_old_fs);

    return res;
}

文件的属性存储在内核类型struct kstat的变量中,该变量在include/linux/stat.h中定义。

同样,vfs_lstat完成sys_lstat的最多工作。

请注意,vfs_statvfs_lstat都使用0/-E约定作为返回值:成功时返回0,失败时返回负错误代码。