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)对比,提交截图