stat命令的实现-mysate

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

提交学习stat(1)的截图

使用man 1 stat打开stat手册页:

命令选项:

-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:显示版本信息。

用stat显示文件信息:

用stat显示文件所在文件系统信息:

man -k ,grep -r的使用

使用man -k stat | grep 1查看用户命令

使用man -k stat | grep2查看相关函数

man 2 stat的使用

伪代码

判断输入中是否包含文件参数,如果有则继续,没有则提示用户输入错误
声明结构体,调用函数stat();
打印输出
  节点ino;
  文件类型mode;
  文件的连接数nlink
  用户ID uid和组ID gid;
  块大小blksize;
  字节数size;
  块数目blocks;
  三个时间atime、mtime和ctime

产品代码 mystate.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/wu-zhuohang/codes/v7rhxmzjse92t0d4cnku569

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

  • mystat

+stat

posted @ 2022-10-15 10:49  20201224吴卓航  阅读(38)  评论(0编辑  收藏  举报