- 姓名 :万大明
- 学号 :201821121058
- 班级 :计算1812
1. 编写程序
#include <stdio.h> #include <string.h> #include <unistd.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <fcntl.h> #include <pwd.h> #include <grp.h> void myls_l(char *pathname); int main(int argc, char *argv[]) { char buf[1024] = ""; //路径名 // if(argc == 1) //没有输入其他参数时,打开当前目录 { getcwd(buf, sizeof(buf)); //获得当前路径 myls_l(buf); } else //输入要展示的目录 { myls_l(argv[1]); int i = 2; while(i < argc) { printf(" "); myls_l(argv[i]); i++; } } return 0; } void myls_l(char *pathname) { DIR *cwd = NULL; //路径文件指针 struct dirent *det = NULL; //记录读到的文件信息 struct stat statbuf = {0}; //记录文件的属性 struct passwd *pwd = NULL; //记录文件所属用户 struct group *grp = NULL; //记录文件所属用户组 struct tm mtm = {0}; chdir(pathname); //!非常重要,否则无法获取文件属性 //printf("%s ", buf); //输出当前路径 cwd = opendir(pathname); //打开目录 while(NULL != (det = readdir(cwd))) //遍历当前目录 { if(strncmp(det->d_name, ".", 1)) { stat(det->d_name, &statbuf); //st_mode //文件类型 if(S_ISREG(statbuf.st_mode)) printf("-"); //普通文件 else if(S_ISDIR(statbuf.st_mode)) printf("d"); //目录文件 else if(S_ISCHR(statbuf.st_mode)) printf("c"); //字符设备文件 else if(S_ISBLK(statbuf.st_mode)) printf("b"); //块设备文件 else if(S_ISFIFO(statbuf.st_mode)) printf("p"); //管理文件 else if(S_ISLNK(statbuf.st_mode)) printf("l"); //链接文件 else if(S_ISSOCK(statbuf.st_mode)) printf("s"); //套接字文件 //st_mode //文件权限 if(statbuf.st_mode & S_IRUSR) printf("r"); else printf("-"); if(statbuf.st_mode & S_IWUSR) printf("w"); else printf("-"); if(statbuf.st_mode & S_IXUSR) printf("x"); else printf("-"); if(statbuf.st_mode & S_IRGRP) printf("r"); else printf("-"); if(statbuf.st_mode & S_IWGRP) printf("w"); else printf("-"); if(statbuf.st_mode & S_IXGRP) printf("x"); else printf("-"); if(statbuf.st_mode & S_IROTH) printf("r"); else printf("-"); if(statbuf.st_mode & S_IWOTH) printf("w"); else printf("-"); if(statbuf.st_mode & S_IXOTH) printf("x"); else printf("-"); //st_nlink //硬链接数 printf("%2ld ", statbuf.st_nlink); //st_uid //属主 pwd = getpwuid(statbuf.st_uid); printf("%s ", pwd->pw_name); //st_gid //属组 grp = getgrgid(statbuf.st_gid); printf("%s ", grp->gr_name); //st_size //文件大小 printf("%5ld ", statbuf.st_size); //st_mtim //最后修改时间 localtime_r(&(statbuf.st_mtime), &mtm); printf("%d月", mtm.tm_mon + 1); printf("%4d ", mtm.tm_mday); printf("%02d:", mtm.tm_hour); printf("%02d ", mtm.tm_min); //st_name //文件名 printf("%s ", det->d_name); } } closedir(cwd); //关闭目录 }
2. 分析运行结果
给出运行结果截图,对于每一列是如何获取的,结合源代码做解释
ls -lai运行结果:
![](https://img2020.cnblogs.com/blog/1785926/202004/1785926-20200430190659957-812646958.png)
解释:total 392的意思为所列出内容的磁盘占用空间总和值为392kb .
./myla运行结果:
结果解释:
第一列解释(从“-”到第一列结束):r表示读权限,w表示写权限,x表示可执行权限,'-' 表示无权限
1)第一排为文件类型,"-"和"p"分别表示此文件为普通文件和管理文件
代码实现为:
2)第二到三排(rwx)表示所有者及所有者权限
3)第四到五排(r-x)表示组用户权限,即一个组中除所有者拥有的权限
4)第六到七排(r-x)表示其他用户权限
代码实现为(代码过长截取部分):
第二列表示文件连接数为‘1’,代码实现为:
第三列表示用户名为“wandaming”,代码实现为:
第四列表示组用户名为“jmu-cs-18”,实现代码为:
第五列表示文件大小,实现代码为:
第六七八列表示文件最后修改时间,实现代码为:
第九列表示文件名称,实现代码为:
3. 通过该实验产生新的疑问及解答
文件系统到底有什么用:
1)存储空间管理
2)目录管理
3)读写管理和保护
4)目标:提高外存储空间的利用率