操作系统第4次实验报告:文件系统
- 姓名:吴永锋
- 学号:201821121051
- 班级:计算1812
1. 编写程序
在服务器上用Vim编写一个程序:实现Linux系统命令ls -lai
的功能,给出源代码。
1 #include<stdio.h> 2 #include<string.h> 3 #include<sys/types.h> 4 #include<dirent.h> 5 #include<sys/stat.h> 6 #include<grp.h> 7 #include<pwd.h> 8 9 void do_ls(char []); 10 void dostat(char *); 11 void show_file_info(char *, struct stat *); 12 void mode_to_letters(int mode, char str[]); 13 char *uid_to_name(uid_t uid); 14 char *gid_to_name(gid_t gid); 15 16 int main(int argc, char **argv) 17 { 18 if (argc == 1) 19 { 20 do_ls("."); 21 } 22 else 23 { 24 while (--argc) 25 { 26 printf("%s:\n", *++argv); 27 do_ls(*argv); 28 } 29 } 30 return 0; 31 } 32 //获取目录下文件名 33 void do_ls(char dirname[]) 34 { 35 DIR *dir_ptr; 36 struct dirent *direntp; 37 38 if ((dir_ptr = opendir(dirname)) == NULL) 39 { 40 fprintf(stderr, "ls2: cannot open %s\n", dirname); 41 } 42 else 43 { 44 while((direntp = readdir(dir_ptr)) != NULL) 45 { 46 dostat(direntp->d_name); 47 } 48 closedir(dir_ptr); 49 } 50 } 51 52 void dostat(char *filename) 53 { 54 struct stat info; 55 if (stat(filename, &info) == -1) 56 { 57 perror(filename); 58 } 59 else 60 { 61 show_file_info(filename, &info); 62 } 63 } 64 //获取文件详细信息 65 void show_file_info(char *filename, struct stat *info_p) 66 { 67 char *uid_to_name(), *ctime(), *gid_to_name(); 68 void mode_to_letters(); 69 char modestr[11]; 70 71 mode_to_letters(info_p->st_mode, modestr); 72 printf("%d ",(int)info_p->st_ino); //索引号 73 printf("%s",modestr); //文件类型 74 printf("%4d ",(int)info_p->st_nlink); //链接数 75 printf("%-8s ", uid_to_name(info_p->st_uid)); //用户id 76 printf("%-8s ", gid_to_name(info_p->st_gid)); //组id 77 printf("%8ld ", (long)info_p->st_size); //文件大小 78 printf("%.12s ", 4 + ctime(&info_p->st_mtime)); //修改时间 79 printf("%s\n", filename); //文件名 80 } 81 82 void mode_to_letters(int mode, char str[]) 83 { 84 strcpy(str, "-----------"); 85 86 if (S_ISDIR(mode)) str[0] = 'd'; 87 if (S_ISCHR(mode)) str[0] = 'c'; 88 if (S_ISBLK(mode)) str[0] = 'b'; 89 90 if (mode & S_IRUSR) str[1] = 'r'; 91 if (mode & S_IWUSR) str[2] = 'w'; 92 if (mode & S_IXUSR) str[3] = 'x'; 93 94 if (mode & S_IRGRP) str[4] = 'r'; 95 if (mode & S_IWGRP) str[5] = 'w'; 96 if (mode & S_IXGRP) str[6] = 'x'; 97 98 if (mode & S_IROTH) str[7] = 'r'; 99 if (mode & S_IWOTH) str[8] = 'w'; 100 if (mode & S_IXOTH) str[9] = 'x'; 101 } 102 103 char *uid_to_name(uid_t uid) 104 { 105 struct passwd * getpwuid(), *pw_ptr; 106 static char numstr[10]; 107 108 if ((pw_ptr = getpwuid(uid)) == NULL) 109 { 110 sprintf(numstr, "%d", uid); 111 return numstr; 112 } 113 else 114 { 115 return pw_ptr->pw_name; 116 } 117 } 118 119 char *gid_to_name(gid_t gid) 120 { 121 struct group *getgrgid(), *grp_ptr; 122 static char numstr[10]; 123 124 if ((grp_ptr = getgrgid(gid)) == NULL) 125 { 126 sprintf(numstr, "%d", gid); 127 return numstr; 128 } 129 else 130 { 131 return grp_ptr->gr_name; 132 } 133 }
2. 分析运行结果
(1) ls -lai运行结果:
(2) lai.c运行结果:
(3) 每一列获取的方法:
(4) 分析:
3. 通过该实验产生新的疑问及解答
问题:linux的ls命令中文件颜色含义是是什么?
解答:linux命令ls会显示出文件的颜色, 系统约定的默认颜色含义如下:
如果需要修改的话, 可以在环境变量$LS_COLORS上修改就行。
想永久保存在~/.bashrc里修改。