• 姓名:肖斯凯
  • 学号:201821121015
  • 班级:计算1811

1. 编写程序

  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 ls(char []);
 10 void stat(char *);
 11 void info(char *, struct stat *);
 12 void letters(int mode, char str[]);
 13 char *utn(uid_t uid);
 14 char *gtn(gid_t gid);
 15 
 16 int main(int argc, char **argv)
 17 {
 18     if (argc == 1)
 19     {
 20         ls(".");
 21     }
 22     else
 23     {
 24         while (--argc)
 25         {
 26             printf("%s:\n", *++argv);
 27             ls(*argv);
 28         }
 29     }
 30     return 0;
 31 }
 32 
 33 void 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             stat(direntp->d_name);
 47         }
 48         closedir(dir_ptr);
 49     }
 50 }
 51 
 52 void stat(char *filename)
 53 {
 54     struct stat info;
 55     if (stat(filename, &info) == -1)
 56     {
 57         perror(filename);
 58     }
 59     else
 60     {
 61         info(filename, &info);
 62     }
 63 }
 64 
 65 void info(char *filename, struct stat *info_p)
 66 {
 67     char *utn(), *ctime(), *gtn();
 68     void letters();
 69     char modestr[11];
 70 
 71     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 ", utn(info_p->st_uid));
 76     printf("%-8s ", gtn(info_p->st_gid));
 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 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 *utn(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 *gtn(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. 分析运行结果

3. 通过该实验产生新的疑问及解答

通过该实验如果有产生新的疑问,可以写出来,并尝试自己解决问题。