stat命令的实现

stat命令的实现-mysate(必做)

学习使用stat(1),并用C语言实现 1. 提交学习stat(1)的截图 2. man -k ,grep -r的使用 3. 伪代码 4. 产品代码 mystate.c,提交码云链接 5. 测试代码,mystat 与stat(1)对比,提交截图
  • 用man stat查看

stat命令的实现

 

 

 

  •  在手册中通过man -k stat | grep 2查询stat命令的系统调用,如图所示stat命令的实现

     

  • man 2 stat查看stat()函数的使用方法stat命令的实现
    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;      //文件字节数(文件大小)
        unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
        unsigned long st_blocks;    //块数
        time_t        st_atime;     //最后一次访问时间
        time_t        st_mtime;     //最后一次修改时间
        time_t        st_ctime;     //最后一次改变时间(指属性)
    };
    

      伪代码实现

  • 1.判断输入中是否包含文件参数,如果有则继续,没有则提示用户输入错误
    2.声明结构体,并调用stat()函数给结构体赋值
    3.逐个取出结构体中的数据并输出即可
    4.注意文件的mode需要switch来判断

    代码实现

     1 #include <sys/types.h>
     2 #include <sys/stat.h>
     3 #include <time.h>
     4 #include <stdio.h>
     5 #include <stdlib.h>
     6 
     7 int main(int argc, char *argv[])
     8 {
     9     struct stat sb;
    10     if (argc != 2) {
    11         fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
    12         exit(EXIT_FAILURE);
    13     }
    14     if (stat(argv[1], &sb) == -1) {
    15         perror("stat");
    16         exit(EXIT_FAILURE);
    17     }
    18     printf("文件: %s\n",argv[1]);
    19     printf("I-node:            %ld\n", (long) sb.st_ino);
    20     printf("硬连接:               %ld\n", (long) sb.st_nlink);
    21     printf("权限:                UID=%ld   GID=%ld\n",(long) sb.st_uid, (long) sb.st_gid);
    22     printf("IO块: %ld ",(long) sb.st_blksize);
    23     switch (sb.st_mode & S_IFMT) {
    24         case S_IFBLK:   printf("块设备\n");
    25             break;
    26     case S_IFCHR:   printf("character device\n");
    27             break;
    28     case S_IFDIR:   printf("目录\n");
    29             break;
    30     case S_IFIFO:   printf("FIFO/管道\n");
    31             break;
    32     case S_IFLNK:   printf("符号链接\n");
    33             break;
    34     case S_IFREG:   printf("普通文件\n");
    35             break;
    36     case S_IFSOCK:  printf("socket\n");
    37             break;
    38     default:        printf("未知?\n");
    39             break;
    40     }
    41     printf("大小:                %lld bytes\n",(long long) sb.st_size);
    42     printf("块:         %lld\n",(long long) sb.st_blocks);
    43     printf("最近访问:         %s", ctime(&sb.st_atime));
    44     printf("最近更改:   %s", ctime(&sb.st_mtime));
    45     printf("最近改动:       %s", ctime(&sb.st_ctime));
    46     exit(EXIT_SUCCESS);
    47 }

    编译运行stat命令的实现

     

上一篇:mystat


下一篇:zookeeper是如何保证创建的节点是唯一的?