• stat命令的实现mysate


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

    man 1 stat

    参数说明

    参数 参数说明
    -L 支持符号连接;
    -f 显示文件系统状态而非文件状态;
    -c 按照指定格式输出;
    -t 以简洁方式输出信息;
    –help 显示指令的帮助信息;
    –version 显示指令的版本信息。

    文件的有效格式序列

    格式符 格式符说明
    %a 八进制中的访问权限
    %A 人类可读形式的访问权
    %b 分配的块数(请参阅%B)
    %B %b报告的每个块的大小(字节)
    %C SELinux安全上下文字符串
    %d 十进制设备编号
    %D 十六进制的设备编号
    %f 十六进制原始模式
    %F 文件类型
    %g 所有者的组ID
    %G 所有者的组名称
    %h 硬链接数
    %i inode数
    %m 挂载点
    %n 文件名
    %N 带取消引用(如果是符号链接)的带引号的文件名
    %o 最佳I/O传输大小提示
    %s 总大小,以字节为单位
    %t 主要设备类型(十六进制),用于字符/块设备特殊文件
    %T 次要设备类型(十六进制),用于字符/块设备特殊文件
    %u 所有者的用户ID
    %U 所有者的用户名
    %w 文件出生时间,人类可读;-如果未知
    %W 文件生成时间,自纪元起的秒数;如果未知,则为0
    %x 最后一次访问的时间,人类可读
    %X 上次访问的时间,自纪元起的秒数
    %y 上次修改的时间,人类可读
    %Y 上次修改的时间,自纪元起的秒数
    %z 最后更改的时间,人类可读
    %Z 上次更改的时间,自新纪元起的秒数

    文件系统的有效格式序列

    格式符 格式符说明
    %a 非超级用户可用的空闲块
    %b 文件系统中的数据块总数
    %c 文件系统中的文件节点总数
    %d 文件系统中的空闲文件节点
    %f 文件系统中的空闲块
    %i 十六进制文件系统ID
    %l 文件名的最大长度
    %n 文件名
    %s 块大小(用于更快的传输)
    %S 基本块大小(用于块计数)
    %t 十六进制文件系统类型
    %T 人类可读形式的文件系统类型

    1. 查看文件状态信息

    2. -f查看文件所在文件系统状态信息

    3. -t以简洁形式输出文件信息

    简洁形式主要是把每个值的列头去掉了,只显示值,三个时间按照纪元至今秒数显示。

    4. -L显示软连接原始文件状态信息

    5. 获取文件inode

    6. 获取文件所属用户或者用户ID

    7. 获取文件所属用户组或者用户组ID

    8. 获取文件磁盘挂载点

    9. 获取文件访问时间

    10. 获取文件修改时间

    11. 获取文件更改时间

    12. 获取文件权限

    二、 man -k ,grep -r的使用

    1. man -k stat

    2. man -k stat | grep 2 查找系统调用

    3. man -k stat | grep file

    4. grep -r status

    三、伪代码

    代码外操作:

    • 用户运行 mystat.c 程序,输入文件名
    • 由man 2 stat函数学习后可知调用stat函数实现功能
    • 结构体struct stat:

    代码需要完成的操作:

    将文件的相关参数(从stat test.c输出结果中引号前面的部分作为需要捕获的信息)。信息找到后,并定义printf语句将它们分别输出。

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

    mystat.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("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("I-node number:            %ld\n", (long) sb.st_ino);
        printf("Mode:                     %lo (octal)\n",(unsigned long) sb.st_mode);
        printf("Link count:               %ld\n", (long) sb.st_nlink);
        printf("Ownership:                UID=%ld   GID=%ld\n",(long) sb.st_uid, (long) sb.st_gid);
        printf("Preferred I/O block size: %ld bytes\n",(long) sb.st_blksize);
        printf("File size:                %lld bytes\n",(long long) sb.st_size);
        printf("Blocks allocated:         %lld\n",(long long) sb.st_blocks);
        printf("Last status change:       %s", ctime(&sb.st_ctime));
        printf("Last file access:         %s", ctime(&sb.st_atime));
        printf("Last file modification:   %s", ctime(&sb.st_mtime));
        exit(EXIT_SUCCESS);
    }

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

     

  • 相关阅读:
    java 二维码图片生成工具类
    我的PHP学习过程
    js简单表格操作
    在同一个textarea文本框中设置不同的字体
    基础入门--创建项目
    异常处理方式
    2019年度的瞎几把总结
    WebAPI 返回值
    关于背景色
    使用echarts进行画图
  • 原文地址:https://www.cnblogs.com/20201212ycy/p/16777225.html
Copyright © 2020-2023  润新知