1 1 /*
2 2 用于获取文件的属性和元数据信息,并输出到终端。
3 3 程序接受一个参数作为路径名,通过lstat函数获取指定文件的属性信息,并使用printf函数输出到终端。
4 4 注释对代码进行了简要解释,帮助理解各个部分的功能。
5 5 */
6 6 #include <sys/types.h>
7 7 #include <sys/stat.h>
8 8 #include <stdint.h>
9 9 #include <time.h>
10 10 #include <stdio.h>
11 11 #include <stdlib.h>
12 12 #include <sys/sysmacros.h>
13 13
14 14 int main(int argc, char *argv[])
15 15 {
16 16 struct stat sb;
17 17
18 18 // 检查参数数量
19 19 if (argc != 2) {
20 20 fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
21 21 exit(EXIT_FAILURE);
22 22 }
23 23
24 24 // 获取文件属性
25 25 if (lstat(argv[1], &sb) == -1) {
26 26 perror("lstat");
27 27 exit(EXIT_FAILURE);
28 28 }
29 29
30 30 // 输出所属设备ID
31 31 printf("ID of containing device: [%jx,%jx]\n",
32 32 (uintmax_t) major(sb.st_dev),
33 33 (uintmax_t) minor(sb.st_dev));
34 34
35 35 printf("File type: ");
36 36
37 37 // 输出文件类型
38 38 switch (sb.st_mode & S_IFMT) {
39 39 case S_IFBLK: printf("block device\n"); break;
40 40 case S_IFCHR: printf("character device\n"); break;
41 41 case S_IFDIR: printf("directory\n"); break;
42 42 case S_IFIFO: printf("FIFO/pipe\n"); break;
43 43 case S_IFLNK: printf("symlink\n"); break;
44 44 case S_IFREG: printf("regular file\n"); break;
45 45 case S_IFSOCK: printf("socket\n"); break;
46 46 default: printf("unknown?\n"); break;
47 47 }
48 48
49 49 printf("I-node number: %ju\n", (uintmax_t) sb.st_ino);
50 50
51 51 // 输出文件权限模式
52 52 printf("Mode: %jo (octal)\n",
53 53 (uintmax_t) sb.st_mode);
54 54
55 55 // 输出链接数
56 56 printf("Link count: %ju\n", (uintmax_t) sb.st_nlink);
57 57
58 58 // 输出文件所有者信息
59 59 printf("Ownership: UID=%ju GID=%ju\n",
60 60 (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);
61 61
62 62 // 输出首选I/O块大小
63 63 printf("Preferred I/O block size: %jd bytes\n",
64 64 (intmax_t) sb.st_blksize);
65 65
66 66 // 输出文件大小
67 67 printf("File size: %jd bytes\n",
68 68 (intmax_t) sb.st_size);
69 69
70 70 // 输出分配的块数
71 71 printf("Blocks allocated: %jd\n",
72 72 (intmax_t) sb.st_blocks);
73 73
74 74 // 输出最后状态更改时间
75 75 printf("Last status change: %s", ctime(&sb.st_ctime));
76 76
77 77 // 输出最后访问文件的时间
78 78 printf("Last file access: %s", ctime(&sb.st_atime));
79 79
80 80 // 输出最后修改文件的时间
81 81 printf("Last file modification: %s", ctime(&sb.st_mtime));
82 82
83 83 exit(EXIT_SUCCESS);
84 84 }