吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1978|回复: 6
收起左侧

[其他转载] C语言编程实现mystat

[复制链接]
liyu111 发表于 2021-11-14 20:27

C语言编程实现mystat

本人纯小白,目前正在学习操作系统和内核编程。如有错误,欢迎各位大佬批评指正。轻喷{:1_932:}

linux内核实践

学习使用stat(1),并用C语言实现

  1. 学习stat(1)
  2. man -k , grep -r
  3. 伪代码
  4. 产品代码 mystate.c
  5. 测试代码,mystat 与stat(1)对比

实践内容

0.实践环境

OpenEuler 20.03 LTS

0 2021-11-02 195547.png

1.学习stat(1):

虽然在OpenEuler中安装了完整man手册,但现在看来好像也不那么“完整”

1 2021-11-02 201751.png

不过好在与stat相关的系统调用可以查到:

2 2021-11-02 201625.png

在Ubuntu中通过man手册来学习 stat 命令相关使用方法:

3 2021-11-02 201920.png

通过stat命令可以显示以下信息:

  • File:显示文件名
  • Size:显示文件大小
  • Blocks:文件使用的数据块总数
  • IO Block:IO块大小
  • regular file:文件类型(常规文件)
  • Device:设备编号
  • Inode:Inode号
  • Links:链接数
  • Access:文件的权限
  • Gid、Uid:文件所有权的Gid和Uid。

Linux 下的三个时间:

1. Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间 
2. Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。 
3. Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。

stat的常用参数:

  • -f:不显示文件本身的信息,显示文件所在文件系统的信息
  • -L:显示符号链接
  • -t:简洁模式,只显示摘要信息

总结:

stat命令显示的是文件的I节点信息。Linux文件系统以块为单位存储信息,为了找到某一个文件所在存储空间的位置,用I节点对每个文件进行索引,I节点包含了描述文件所必要的全部信息,其中包含了文件的大小,类型,存取权限,文件的所有者。

2.使用man -k, grep -r 掌握stat命令接口

man -k stat
man 2 stat

stat 命令头文件及接口:

4 2021-11-02 203017.png

#include <fcntl.h>           /* Definition of AT_* constants */
#include <sys/stat.h>

int stat(const char *file_name, struct stat *buf );

stat 结构体:

5 2021-11-02 203112.png

struct stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    blksize_t     st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    blocks_t      st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
  };

3.伪代码

main{
检查命令参数
获取文件属性
打印文件属性
{
文件设备编号
文件i节点标号
文件类型与权限
所有者
文件大小
文件系统缓冲区大小
占有区块数
文件最近访问时间
文件最后修改时间
最近更改时间
}
结束
}

4.产品代码

6 2021-11-02 210132.png

码云链接:https://gitee.com/DKY2019/xxaqxt/blob/master/mystat.c

5.测试代码

stat:

7 2021-11-02 210311.png

由于没有安装中文输入法 D:

所以直接输出英文了

另外排版上有一些不足

mystat与stat对比:

8 2021-11-02 210612.png

参考资料:

stat详解  https://www.cnblogs.com/ultranms/p/9353347.html

免费评分

参与人数 2吾爱币 +6 热心值 +2 收起 理由
Cool_Breeze + 1 + 1 我很赞同!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kanxue2018 发表于 2021-11-14 23:44

多练习,做小项目,效果更好
wuhui316 发表于 2021-11-16 08:55
路人癸 发表于 2021-12-14 03:55
 楼主| liyu111 发表于 2021-12-19 16:26
路人癸 发表于 2021-12-14 03:55
加油啊,加油,楼主很强大

谢谢您,我会继续加油
 楼主| liyu111 发表于 2021-12-19 16:27

谢谢您,我会继续加油
 楼主| liyu111 发表于 2021-12-19 16:29
kanxue2018 发表于 2021-11-14 23:44
多练习,做小项目,效果更好

谢谢您,我会继续加油
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表