Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从内核模块确定文件类型?_C_Kernel Module - Fatal编程技术网

C 如何从内核模块确定文件类型?

C 如何从内核模块确定文件类型?,c,kernel-module,C,Kernel Module,是否有类似于struct dirent*->d_type的东西,包含DT_REG、DT_DIR、DT_SOCK等内核结构,例如struct file?看看它的田地,我找不到任何适合这个用途的东西 也许有人知道readdir如何决定d_类型?我在这里看它的实施,我不明白这里发生了什么 Ubuntu18.04,4.15.0-45内核版本是一个位字段,可以使用标准的S_ISDIR,S_ISREG,S_ISLNK等宏进行检查: : /* *测试inode是否为快速符号链接。 *快速符号链接的符号链接数据

是否有类似于
struct dirent*->d_type
的东西,包含
DT_REG
DT_DIR
DT_SOCK
等内核结构,例如
struct file
?看看它的田地,我找不到任何适合这个用途的东西

也许有人知道
readdir
如何决定
d_类型
?我在这里看它的实施,我不明白这里发生了什么

Ubuntu18.04,4.15.0-45内核版本是一个位字段,可以使用标准的
S_ISDIR
S_ISREG
S_ISLNK
等宏进行检查:

:

/*
*测试inode是否为快速符号链接。
*快速符号链接的符号链接数据存储在ext4\u inode\u info->i\u data中。
*/
int ext4\u inode\u是\u fast\u符号链接(结构inode*inode)
{
if(!(EXT4_I(inode)->I_标志和EXT4_EA_inode_FL)){
int ea_blocks=EXT4_I(inode)->I_file\u acl?
EXT4_集群大小(inode->i_sb)>>9:0;
if(ext4_有_内联_数据(inode))
返回0;
返回(S_ISLNK(inode->i_模式)&&inode->i_块-ea_块==0);
}
返回S_ISLNK(inode->i_模式)和&inode->i_大小&&
(inode->i_大小

请注意,在遍历此类内核结构时需要非常小心。如果您没有使用正确的锁,它们可能会从线程下变出来检查它们。

您需要解决的实际问题是什么?为什么需要这样一个字段?我的实际问题是确定某个进程打开的文件类型(我有它的
struct task\u struct
),然后像“3个常规文件、1个套接字、1个管道”那样计算它们。什么操作系统?你漏掉了,这有点重要…你在找什么?如果文件已经打开,请使用
fstat()
。啊,你是说当前进程之外的其他进程?是这样吗?
/*
 * 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);
}