在没有open()的情况下获取内核空间中的文件描述符和细节

时间:2014-02-25 00:25:04

标签: c linux linux-kernel

有人能提供代码来解决这个问题吗?

有效地,如果文件struct inode*,我们如何从内核级别获取/dev/driver1

在用户空间中给出:

int fd;
fd = open("/dev/driver1", O_RDWR | O_SYNC);

在内核空间:

static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
struct dev_handle *handle;
handle = file->private_data;    

假设我们不走那条路,

我们如何在内核中获得,例如。硬编码要处理的file->private_data

2 个答案:

答案 0 :(得分:2)

您正在寻找filp_open功能。来自档案include/linux/fs.h

struct file *filp_open(const char *filename, int flags, umode_t mode);

以下是功能来源和文档的链接:http://lxr.free-electrons.com/source/fs/open.c#L937

如果你真的需要FD,你可以使用sys_open(不在较新的内核中导出):

long sys_open(const char __user *filename, int flags, int mode);

您可以在类似的问题上找到一个非常好的答案: How to read/write files within a Linux kernel module?

修改(如何获取inode):

您可以从inode缓存struct file

struct file *file = ...;
struct inode *inode = file->inode;

如果您想要锁定:这是背景:Documentation/filesystems/path-lookup.txt

遍历的起点是current->fs->root。内核中有许多功能已经完成,你可以在fs/namei.c源文件中找到它们。

有一个功能:kern_path

int error;
struct inode *inode;
struct path path;

error = kern_path(pathname, LOOKUP_FOLLOW, &path);
if (error) ...;

inode = path.dentry->d_inode;

答案 1 :(得分:1)

您的代码是否在dev_ioctl函数中? 如果是,那么

static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
    struct dev_handle *handle;
    struct inode *inode;
    handle = file->private_data;    
    inode = file->f_inode;

似乎没有关于锁定要求的合理文档,因此您应该尝试挖掘类似的代码并查看它在f_inode成员上的运作方式。