- 姓名:肖斯凯
- 学号: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. 通过该实验产生新的疑问及解答
通过该实验如果有产生新的疑问,可以写出来,并尝试自己解决问题。