mystat

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

1.提交学习stat(1)的截图

首先man一下

可以看出,stat命令可以用来显示文件的详细信息,包括inode, atime, mtime, ctime

stat -f 显示文件系统的信息

stat -t 以简洁的方式输出

stat * 显示该目录下所有文件及子目录的信息

stat显示了三个很重要的时间,分别是access、modify和change time,他们的区别如下:

  • 当我们仅仅只是读取文件时,access time 改变,而modify,change time 不会改变
  • 当修改文件时,access,modify,change time 都会跟着改变
  • 当修改文件属性时,change time 改变,而access,modify time 不变。

2.man -k ,grep -r的使用

man -k xxx可以搜索出所有带有xxx关键字的命令,比如

因为Linux命令可分为以下八种

MANUAL SECTIONS
    The standard sections of the manual include:
 
    1      User Commands
    2      System Calls
    3      C Library Functions
    4      Devices and Special Files
    5      File Formats and Conventions
    6      Games et. Al.
    7      Miscellanea
    8      System Administration tools and Deamons

所以我们可以通过命令man -k stat | grep 2来查看stat命令的系统调用

发现了一个结构体

从这里我们可以知道只要调用stat函数就可以实现stat命令的功能,此外,文件类型的输出是一个整数,我们还要加一步判断

3.伪代码

由上面的分析我们可以得出伪代码

1.判断输入的文件是否存在或者正确
2.调用结构体并赋值
3.输出结构体  

4.产品代码 mystate.c,提交码云链接

#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    struct stat sb;
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if (stat(argv[1], &sb) == -1) {
        perror("stat");
        exit(EXIT_FAILURE);
    }
    printf("文件: %s\n",argv[1]);
    printf("大小: %lld bytes\n",(long long) sb.st_size);
    printf("块: %lld\n",(long long) sb.st_blocks);
    printf("IO块: %ld ",(long) sb.st_blksize);
    switch (sb.st_mode & S_IFMT) {
        case S_IFBLK:   printf("块设备\n");
            break;
    case S_IFCHR:   printf("character device\n");
            break;
    case S_IFDIR:   printf("目录\n");
            break;
    case S_IFIFO:   printf("FIFO/管道\n");
            break;
    case S_IFLNK:   printf("符号链接\n");
            break;
    case S_IFREG:   printf("普通文件\n");  
            break;
    case S_IFSOCK:  printf("socket\n");
            break;
    default:        printf("未知?\n");
            break;
    }
    printf("I-node: %ld\n", (long) sb.st_ino);
    printf("硬连接: %ld\n", (long) sb.st_nlink);
    printf("权限: UID=%ld   GID=%ld\n",(long) sb.st_uid, (long) sb.st_gid);
    printf("最近访问: %s", ctime(&sb.st_atime));
    printf("最近更改: %s", ctime(&sb.st_mtime));
    printf("最近改动: %s", ctime(&sb.st_ctime));
    exit(EXIT_SUCCESS);
}

码云链接
https://gitee.com/qiu_yu_wang/code/issues/I4H706

5.测试代码,mystat 与stat(1)对比,提交截图

参考:
https://blog.csdn.net/jerry_1126/article/details/52716571
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html

posted @   20191316王秋雨  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2019-11-06 2019-2020 191316《信息安全专业导论》第六周学习总结
点击右上角即可分享
微信分享提示