当前位置: 首页 > news >正文

操作系统真相还原:获取文件属性

14.15 获得文件属性

14.15.1 ls命令的幕后功臣

ls 命令中调用了大量的系统调用 stat64write ,其中stat64 用于获得文件的属性信息, write 用于把信息输出到屏幕,即标准输出。这里的 stat64 表示 64 位版本的 stat。 其函数原型是int stat(const char* path, struct stat *buf)

14.15.2 实现sys_stat

先增加记录文件属性的结构体:

/* 文件属性结构体 */
struct stat
{uint32_t st_ino;             // inode编号uint32_t st_size;            // 尺寸enum file_types st_filetype; // 文件类型
};
//定义在fs.h

咱们的 struct stat 很简单,只有 3 个成员,因此只能获得 3 个属性。

/* 在buf中填充文件结构相关信息,成功时返回0,失败返回-1 */
int32_t sys_stat(const char *path, struct stat *buf)
{/* 若直接查看根目录'/' */if (!strcmp(path, "/") || !strcmp(path, "/.") || !strcmp(path, "/..")){buf->st_filetype = FT_DIRECTORY;buf->st_ino = 0;buf->st_size = root_dir.inode->i_size;return 0;}int32_t ret = -1; // 默认返回值struct path_search_record searched_record;memset(&searched_record, 0, sizeof(struct path_search_record)); // 记得初始化或清0,否则栈中信息不知道是什么int inode_no = search_file(path, &searched_record);if (inode_no != -1){struct inode *obj_inode = inode_open(cur_part, inode_no); // 只为获得文件大小buf->st_size = obj_inode->i_size;inode_close(obj_inode);buf->st_filetype = searched_record.file_type;buf->st_ino = inode_no;ret = 0;}else{printk("sys_stat: %s not found\n", path);}dir_close(searched_record.parent_dir);return ret;
}

sys_stat:接受 2 个参数,待获取属性的文件路径 path、存储属性的缓冲区 buf,功能是在 buf 中填充文件结构相关信息,成功时返回 0,失败返回-1 。

首先判断是不是根目录,然后在调用search_file获得该路径对应的inode索引,然后调用inode_open将该inode调入内存,将属性直接写在buf中。

http://www.lryc.cn/news/418038.html

相关文章:

  • 聚鼎装饰画:投资一家装饰画店铺要花费多少钱
  • 编程的魅力、其重要性、学习方法以及未来趋势
  • ubuntu init set
  • MySQL数据分析进阶(八)存储过程
  • 最深的根,
  • 【常见的设计模式】工厂模式
  • postgres收缩工具两种工具的使用对比
  • 仿真入门——CST软件如何设置分布式计算的共享储存
  • 【JVM基础17】——实践-说一下JVM调优工具
  • 【QT】Qt中Websocket的使用
  • 【vue3】【elementPlus】【国际化】
  • 用python实现求两个整数的最大公约数
  • Linux 内核源码分析---proc 文件系统
  • 视频号直播回放怎么下载?
  • 【第九节】python中xml解析和json编解码
  • yolo v8部署到云服务器问题记录
  • 端口被占用,杀死进程的步骤
  • 接口入门(企业常见使用,一分钟搞定版)
  • 深入解析:Cookie 与 Session 的区别及应用场景
  • LLM金融文本分类文档说明
  • EI检索,2天录用,3天见刊!截稿在即,这本水刊你还不投吗?
  • sql获取过去的小时数
  • 【Android Studio】彻底卸载
  • 美术版权可以当做商标使用吗
  • 控制某些请求不记录日志
  • Java线程池原理剖析和应用指南
  • ST-LINK烧录MCU
  • Go - 10. * 值类型和指针类型的差异
  • waf绕过:网络安全狗绕过
  • Django中的模型小总结: