Linux下获取文件大小的方法
Linux下获取文件大小的方法
用户态下:
unsigned long get_file_size(const char *filename) { struct stat buf; if(stat(filename, &buf)<0) { return 0; } return (unsigned long)buf.st_size; }
内核态下:
知识储备:
vfs_stat函数原型:int vfs_stat(char __user *name, struct kstat *stat)
struct kstat定义位于:include/fs.h
struct kstat { u64 ino; dev_t dev; umode_t mode; unsigned int nlink; uid_t uid; gid_t gid; dev_t rdev; loff_t size; struct timespec atime; struct timespec mtime; struct timespec ctime; unsigned long blksize; unsigned long long blocks; };该结构体封装了文件的基本属性
函数 vfs_stat 定义位于:fs/stat.c
int vfs_stat(char __user *name, struct kstat *stat) { return vfs_fstatat(AT_FDCWD, name, stat, 0); //调用了vfs_fstatat } EXPORT_SYMBOL(vfs_stat);
函数 vfs_fstatat 定义于相同文件中
int vfs_fstatat(int dfd, char __user *filename, struct kstat *stat, int flag) { struct path path; int error = -EINVAL; int lookup_flags = 0; if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0) goto out; if (!(flag & AT_SYMLINK_NOFOLLOW)) lookup_flags |= LOOKUP_FOLLOW; error = user_path_at(dfd, filename, lookup_flags, &path); if (error) goto out; error = vfs_getattr(path.mnt, path.dentry, stat); //这里调用 vfs_getattr 获取文件属性 path_put(&path); out: return error; } EXPORT_SYMBOL(vfs_fstatat);
函数 vfs_getattr 定义于相同文件中
int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) { struct inode *inode = dentry->d_inode; int retval; retval = security_inode_getattr(mnt, dentry); if (retval) return retval; if (inode->i_op->getattr) return inode->i_op->getattr(mnt, dentry, stat); //通过 inode 取得文件属性 generic_fillattr(inode, stat); return 0; } EXPORT_SYMBOL(vfs_getattr);
使用:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Mysql实现split函数——支持多字符分割
- 下一篇: PHP Yii 命令行程序以及定时任务详解