Linux 确定文件结构(描述文件描述符)是否为';特殊文件';(即块/字符设备)

Linux 确定文件结构(描述文件描述符)是否为';特殊文件';(即块/字符设备),linux,linux-kernel,Linux,Linux Kernel,我修改了系统调用表,以便在对mmap的用户空间调用时调用我自己的mmap处理程序。 我的处理程序调用原始mmap,并根据结果选择要执行的操作 下面是一段非常简短的代码片段: asmlinkage unsigned long my_mmap_handler(unsigned long addr, unsigned long len, int prot,

我修改了系统调用表,以便在对mmap的用户空间调用时调用我自己的mmap处理程序。 我的处理程序调用原始mmap,并根据结果选择要执行的操作

下面是一段非常简短的代码片段:

asmlinkage unsigned long my_mmap_handler(unsigned long addr,
                                     unsigned long len,
                                     int prot,
                                     int flags,
                                     int fd,
                                     long off)
{
     unsigned long ret_val = old_mmap(addr,len,prot,flags,fd,off);
     if (IS_ERR((void*)ret_val))
         goto end;
     // Do some stuff..
     end:
     return ret_val;
}
在“Dosomething”中,我对实际映射的文件执行一些操作(即从文件中读取)

问题是:

我遇到过尝试mmap字符/块设备的程序(例如/dev/rdi/card0)。每当我试图从这样的文件中读取(例如,使用vfs_read)时,内核就会冻结(不是恐慌,但感觉好像有东西阻塞了)。为什么会发生这种情况? 无论如何,我不需要在字符/块设备上执行操作,因此我一直在尝试找到一种方法,以确定给定的“结构文件”是否表示块/字符设备,如果是,请忽略它。到目前为止运气不好


非常感谢您的帮助

您可以通过读取文件的索引节点结构成员i u rdev来确定文件是块还是字符设备:

file->f_dentry->d_inode->i_rdev

它包含主值和次值,如果不是0,则是一个设备

使用预处理器宏解决它:

 #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))

 defined in linux/fs.h
然后可以按如下方式使用宏来确定文件指针是否“描述”特殊文件:

struct file * f;
// ...
if (special_file(file_inode(f)->i_mode))
{
     /* If we're here then it is a
     block/character device or FIFO/SOCKET file */
}
你在找什么?