stat命令的实现-mysate

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

一、提交学习stat(1)的截图

1.使用man 1 stat查看手册页

stat命令的实现-mysate

stat命令的实现-mysate

2.命令选项

-L, --dereference:跟随符号链接解析原文件而非符号链接;
-f, --file-system:显示文件所在文件系统信息而非文件信息;
-c,--format=FORMAT:以指定格式输出,而非默认格式;

显示文件信息可用格式控制符如下:
%a:以八进制显示访问权限
%A:以可读形式显示访问权限
%b:显示占有块数
%B:显示每一块占有的字节数
%C:SELinux security context string
%d:十进制显示文件所在设备号
%D:十六进制显示文件所在设备号
%f:十六进制显示文件类型
%F:文件类型。Linux下文件类型主要分为普通文件、目录、字符设备文件、块设备文件、符号链接文件、套接字等
%g:文件所有者组ID
%G:文件所有者组名称
%h:文件硬链接数
%i:inode号
%m:文件所在磁盘分区挂载点,比如/data
%n:文件名称
%N:单引号括起来的文件名称,如果是软链接,则同时显示指向的文件名称
%o:optimal I/O transfer size hint
%s:实际文件大小,单位字节
%t:major device type in hex, for character/block device special files
%T:minor device type in hex, for character/block device special files
%u:所有者用户ID
%U:所有者用户名称
%w:文件创建时间,输出-表示无法得知
%W:文件创建时间,输出Unix时间戳,0表示无法得知
%x:可读形式输出最后访问时间atime
%X:Unix时间戳输出最后访问时间atime
%y:可读形式输出最后修改时间mtime
%Y:Unix时间戳输出后修改时间mtime
%z:可读形式输出最后状态改变时间ctime
%Z:Unix时间戳输出最后状态改变时间ctime

显示文件系统信息可用格式控制符有:
%a:非超级用户可使用的*block数
%b:文件系统总block数
%c:文件系统总文件节点数
%d:可用文件节点数
%f:可用文件block数
%i:十六进制文件系统ID
%l:最大文件名称长度
%n:文件名称
%s:一个块的大小,单位字节(for faster transfers)
%S:一个块的基本大小,单位字节(用于统计block的数量)
%t:十六进制输出文件系统类型
%T:可读形式输出文件系统类型

--printf=FORMAT:以指定格式输出,而非默认格式。与--format作用类似,但可以解释反斜杠转义字符,比如换行符\n;
-t, --terse:简洁模式输出,只显示摘要信息;
--help:显示帮助信息;
--version:显示版本信息。

3.stat命令的使用

  • 查看文件详细信息stat filename
    stat命令的实现-mysate

  • 显示文件所在文件系统信息stat -f filename
    stat命令的实现-mysate

  • 以指定格式显示stat -c "格式控制符" filename
    stat命令的实现-mysate

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

  • 使用man -k stat | grep 1查看用户命令
    stat命令的实现-mysate

  • 使用man -k stat | grep2 查看相关函数
    stat命令的实现-mysate

  • 使用man 2 stat查看函数
    stat命令的实现-mysate

3. 伪代码

头文件:#include <sys/types.h> 
       #include <sys/stat.h> 
       #include <unistd.h>
调用stat()函数
打印输出节点ino、
   文件类型mode、
   文件的硬链接数nlink、
   用户ID uid和组ID gid、
   块大小blksize、
   字节数size、
   块数目blocks、
   三个时间atime、mtime和ctime

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

点击查看代码

#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
    struct stat sb;
    if (argc != 2) {
        fprintf(stderr, "Usage: %s \n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if (stat(argv[1], &sb) == -1) {
        perror("stat");
        exit(EXIT_FAILURE);
    }
    printf("File type:                ");
    switch (sb.st_mode & S_IFMT) {
        case S_IFBLK:   printf("block device\n");
            break;
    case S_IFCHR:   printf("character device\n");
            break;
    case S_IFDIR:   printf("directory\n");
            break;
    case S_IFIFO:   printf("FIFO/pipe\n");
            break;
    case S_IFLNK:   printf("symlink\n");
            break;
    case S_IFREG:   printf("regular file\n");
            break;
    case S_IFSOCK:  printf("socket\n");
            break;
    default:        printf("unknown?\n");
            break;
    }
    printf("INode节点: %ld\n", (long) sb.st_ino);
    printf("文件类型: %lo (octal)\n",(unsigned long) sb.st_mode);
    printf("硬链接数: %ld\n", (long) sb.st_nlink);
    printf("用户ID和组ID: UID=%ld   GID=%ld\n",(long) sb.st_uid, (long) sb.st_gid);
    printf("块大小: %ld bytes\n",(long) sb.st_blksize);
    printf("文件字节数: %lld bytes\n",(long long) sb.st_size);
    printf("块数: %lld\n",(long long) sb.st_blocks);
    printf("最后改变时间(指属性): %s", ctime(&sb.st_ctime));
    printf("最后访问时间: %s", ctime(&sb.st_atime));
    printf("最后修改时间: %s", ctime(&sb.st_mtime));
    exit(EXIT_SUCCESS);

码云链接:https://gitee.com/mjy20191329/mjy20191329/issues/I4J461

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

  • mystat
    stat命令的实现-mysate

  • stat(1)
    stat命令的实现-mysate

上一篇:MaxCompute Spark与Spark SQL对比分析及使用注意事项


下一篇:LeetCode刷题笔记-数据结构-day21