确定文件结构(描述文件描述符)是否是“特殊文件”(即块/字符设备)

时间:2016-04-09 13:26:29

标签: linux linux-kernel

我修改了系统调用表,以便在用户空间调用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;
}

在“Do some stuff”中我对实际的映射文件进行一些操作(即从文件中读取)。

问题在于:

我遇到了尝试mmap字符/块设备的程序(例如/ dev / rdi / card0)。每当我尝试从这样的文件中读取(例如使用vfs_read)时,内核会冻结(不是恐慌,但感觉有些东西在阻塞)。为什么会发生这种情况? 无论如何,我不需要对字符/块设备执行操作,所以我一直试图找到一种方法来查明给定的'struct file'是否代表一个块/字符设备,以防它只是忽略它。到目前为止没有运气。

帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

您可以通过读取文件的inode结构成员i_rdev来查明文件是块还是字符设备:

file->f_dentry->d_inode->i_rdev

它包含主要的次要值,如果它不是0则是设备

答案 1 :(得分: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 */
}