stat命令的实现-mysate(必做)
学习使用stat(1),并用C语言实现 1. 提交学习stat(1)的截图 2. man -k ,grep -r的使用 3. 伪代码 4. 产品代码 mystate.c,提交码云链接 5. 测试代码,mystat 与stat(1)对比,提交截图
- 用man stat查看
- 在手册中通过
man -k stat | grep 2
查询stat命令的系统调用,如图所示 -
man 2 stat
查看stat()
函数的使用方法struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号 off_t st_size; //文件字节数(文件大小) unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小) unsigned long st_blocks; //块数 time_t st_atime; //最后一次访问时间 time_t st_mtime; //最后一次修改时间 time_t st_ctime; //最后一次改变时间(指属性) };
伪代码实现
-
1.判断输入中是否包含文件参数,如果有则继续,没有则提示用户输入错误 2.声明结构体,并调用stat()函数给结构体赋值 3.逐个取出结构体中的数据并输出即可 4.注意文件的mode需要switch来判断
代码实现
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <time.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 7 int main(int argc, char *argv[]) 8 { 9 struct stat sb; 10 if (argc != 2) { 11 fprintf(stderr, "Usage: %s <pathname>\n", argv[0]); 12 exit(EXIT_FAILURE); 13 } 14 if (stat(argv[1], &sb) == -1) { 15 perror("stat"); 16 exit(EXIT_FAILURE); 17 } 18 printf("文件: %s\n",argv[1]); 19 printf("I-node: %ld\n", (long) sb.st_ino); 20 printf("硬连接: %ld\n", (long) sb.st_nlink); 21 printf("权限: UID=%ld GID=%ld\n",(long) sb.st_uid, (long) sb.st_gid); 22 printf("IO块: %ld ",(long) sb.st_blksize); 23 switch (sb.st_mode & S_IFMT) { 24 case S_IFBLK: printf("块设备\n"); 25 break; 26 case S_IFCHR: printf("character device\n"); 27 break; 28 case S_IFDIR: printf("目录\n"); 29 break; 30 case S_IFIFO: printf("FIFO/管道\n"); 31 break; 32 case S_IFLNK: printf("符号链接\n"); 33 break; 34 case S_IFREG: printf("普通文件\n"); 35 break; 36 case S_IFSOCK: printf("socket\n"); 37 break; 38 default: printf("未知?\n"); 39 break; 40 } 41 printf("大小: %lld bytes\n",(long long) sb.st_size); 42 printf("块: %lld\n",(long long) sb.st_blocks); 43 printf("最近访问: %s", ctime(&sb.st_atime)); 44 printf("最近更改: %s", ctime(&sb.st_mtime)); 45 printf("最近改动: %s", ctime(&sb.st_ctime)); 46 exit(EXIT_SUCCESS); 47 }
编译运行