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