操作系统第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会显示出文件的颜色, 系统约定的默认颜色含义如下:

白色:表示普通文件
蓝色:表示目录
绿色:表示可执行文件
红色:表示压缩文件
浅蓝色:链接文件 主要是使用ln命令建立的文件
红色闪烁:表示链接的文件有问题
黄色:表示设备文件
灰色:表示其他文件

如果需要修改的话, 可以在环境变量$LS_COLORS上修改就行。

想永久保存在~/.bashrc里修改。

 

 

posted on 2020-04-30 17:41  矩小阵  阅读(205)  评论(0编辑  收藏  举报

导航