c - 如何从内核模块确定文件类型?
问题描述
对于内核结构,是否有类似struct dirent* -> d_type
的内容DT_REG
,例如DT_DIR
,?查看它的字段,我找不到任何用于此目的的东西。DT_SOCK
struct file
也许有人知道如何readdir
确定d_type
?我在这里查看它的实现https://github.com/lattera/glibc/blob/master/dirent/readdir.c我不明白这里发生了什么。
Ubuntu18.04、4.15.0-45内核版本
解决方案
该struct inode
字段i_mode
是一个位字段,可以使用标准S_ISDIR
, S_ISREG
, S_ISLNK
et al宏进行检查:
/*
* Keep mostly read-only and often accessed (especially for
* the RCU path lookup and 'stat' data) fields at the beginning
* of the 'struct inode'
*/
struct inode {
umode_t i_mode;
unsigned short i_opflags;
kuid_t i_uid;
kgid_t i_gid;
.
.
.
/*
* Test whether an inode is a fast symlink.
* A fast symlink has its symlink data stored in ext4_inode_info->i_data.
*/
int ext4_inode_is_fast_symlink(struct inode *inode)
{
if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) {
int ea_blocks = EXT4_I(inode)->i_file_acl ?
EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0;
if (ext4_has_inline_data(inode))
return 0;
return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
}
return S_ISLNK(inode->i_mode) && inode->i_size &&
(inode->i_size < EXT4_N_BLOCKS * 4);
}
请注意,您需要非常小心地遍历此类内核结构。如果您没有使用正确的锁,它们可能会从检查它们的线程下更改出来。
推荐阅读
- matplotlib - 我想在 'matplotlibrc font.family' 更改 matplotlib pyplot 字体。但唯一回来的是 'font.family: command not found'
- iis - IIS 可以对 application/x-proto-stream 应用任何额外的压缩吗
- vba - 动态计算文档中特定点的表格数量
- html - Jquery从var选择的另一个属性中设置属性
- django - 如何放置正在创建会话的默认用户
- java - 微配置文件客户端返回 null
- python - 熊猫将列表存储为字符串,但由于十进制而无法将其转换回来
- google-sheets - 有没有办法使用 sumproduct (或其他东西)通过 Google 表格中的复选框从库存中减去?
- xamarin.android - 如何在 Xamarin.Andriod 中制作轮播视图
- swift - 为什么我可以更改 get-only 属性?