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>
", argv[0]);
        exit(EXIT_FAILURE);
    }
    if (stat(argv[1], &sb) == -1) {
        perror("stat");
        exit(EXIT_FAILURE);
    }
    printf("文件: %s
",argv[1]);
    printf("大小: %lld bytes
",(long long) sb.st_size);
    printf("块: %lld
",(long long) sb.st_blocks);
    printf("IO块: %ld ",(long) sb.st_blksize);
    switch (sb.st_mode & S_IFMT) {
        case S_IFBLK:   printf("块设备
");
            break;
    case S_IFCHR:   printf("character device
");
            break;
    case S_IFDIR:   printf("目录
");
            break;
    case S_IFIFO:   printf("FIFO/管道
");
            break;
    case S_IFLNK:   printf("符号链接
");
            break;
    case S_IFREG:   printf("普通文件
");  
            break;
    case S_IFSOCK:  printf("socket
");
            break;
    default:        printf("未知?
");
            break;
    }
    printf("I-node: %ld
", (long) sb.st_ino);
    printf("硬连接: %ld
", (long) sb.st_nlink);
    printf("权限: UID=%ld   GID=%ld
",(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

原文地址:https://www.cnblogs.com/ffffatal/p/15510928.html