
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<sys/stat.h> 5 #include<fcntl.h> 6 #include<pwd.h> 7 #include<grp.h> 8 #include<errno.h> 9 #include<time.h> 10 #include<dirent.h> 11 #include<glob.h> 12 #include<string.h> 13 14 #define BUFSIZE 100 15 #define BUFFSIZE 1024 16 17 voID statjudge(char *path); 18 voID Listl(char *path); 19 voID Listi(char *path); 20 voID Lista(char *path); 21 voID Listh(char *path); 22 23 24 voID statjudge(char *path) 25 { 26 struct stat mystat; 27 28 if(stat(path,&mystat)==-1) 29 { 30 perror("stat()"); 31 return ; 32 } 33 switch(mystat.st_mode&S_IFMT) 34 { 35 case S_IFSOCK: 36 printf("s"); 37 break; 38 case S_IFLNK: 39 printf("l"); 40 break; 41 case S_IFREG: 42 printf("-"); 43 break; 44 case S_IFBLK: 45 printf("b"); 46 break; 47 case S_IFDIR: 48 printf("d"); 49 break; 50 case S_IFCHR: 51 printf("c"); 52 break; 53 case S_IFIFO: 54 printf("P"); 55 break; 56 fefault: 57 break; 58 } 59 60 if(mystat.st_mode&S_IRUSR) 61 putchar(‘r‘); 62 else 63 putchar(‘-‘); 64 if(mystat.st_mode&S_IWUSR) 65 putchar(‘w‘); 66 else 67 putchar(‘-‘); 68 if(mystat.st_mode&S_IXUSR) 69 if(mystat.st_mode&S_ISUID) 70 putchar(‘s‘); 71 else 72 putchar(‘x‘); 73 else 74 putchar(‘-‘); 75 if(mystat.st_mode & S_IRGRP) 76 putchar(‘r‘); 77 else 78 putchar(‘-‘); 79 if(mystat.st_mode & S_IWGRP) 80 putchar(‘w‘); 81 else 82 putchar(‘-‘); 83 if(mystat.st_mode & S_IXGRP) 84 if(mystat.st_mode & S_IsgiD) 85 putchar(‘s‘); 86 else 87 putchar(‘x‘); 88 else 89 putchar(‘-‘); 90 if(mystat.st_mode & S_IROTH) 91 putchar(‘r‘); 92 else 93 putchar(‘-‘); 94 if(mystat.st_mode & S_IWOTH) 95 putchar(‘w‘); 96 else 97 putchar(‘-‘); 98 if(mystat.st_mode & S_IXOTH) 99 if(mystat.st_mode & S_ISVTX)100 putchar(‘t‘);101 else102 putchar(‘x‘);103 else104 putchar(‘-‘);105 106 printf(" %ld",mystat.st_nlink);107 108 //文件拥有者109 struct passwd *pwd=NulL;110 pwd = getpwuID(mystat.st_uID);111 printf(" %s ",pwd->pw_name);112 113 //文件所属组114 struct group *grp=NulL;115 grp=getgrgID(mystat.st_gID);116 printf(" %s ",grp->gr_name);117 118 //总字节个数119 printf(" %ld ",mystat.st_size);120 121 //获取文件时间 atime mtime ctime122 struct tm *tmp=NulL;123 tmp=localtime(&mystat.st_mtim.tv_sec);124 125 //if error126 char buf[BUFSIZE]={};127 strftime(buf,BUFSIZE,"%m月 %d %H:%M ",tmp);128 printf("%s ",buf);129 130 //文件名131 char *p=strrchr(path,‘/‘);132 printf("%s ",++p);133 putchar(‘\n‘);134 return ;135 }136 137 voID Listl(char *path)138 {139 struct stat pstat;140 glob_t pglob;141 char buf[BUFFSIZE]={};142 if(lstat(path,&pstat)<0)143 {144 perror("lstat()");145 return;146 }147 if(!S_ISDIR(pstat.st_mode))148 {149 statjudge(path);150 return;151 }152 strcpy(buf,path);153 strcat(buf,"/*");154 glob(buf,0,NulL,&pglob);155 for(int i=0;i<pglob.gl_pathc;i++)156 {157 statjudge((pglob.gl_pathv)[i]); 158 }159 globfree(&pglob);160 }161 162 voID Listi(char *path)163 {164 struct stat pstat;165 glob_t pglob;166 char buf[BUFFSIZE]={};167 if(lstat(path,&pstat)<0)168 {169 perror("lstat()");170 return;171 }172 if(!S_ISDIR(pstat.st_mode))173 {174 printf("%ld %s\n",pstat.st_ino,path);175 return;176 }177 strcpy(buf,path);178 strcat(buf,"/*");179 glob(buf,&pglob);180 for(int i=0;i<pglob.gl_pathc;i++)181 {182 if(lstat(((pglob.gl_pathv)[i]),&pstat)<0)183 {184 perror("lstat()");185 return;186 }187 char *o=strrchr((pglob.gl_pathv)[i],‘/‘);188 printf("%ld %s\n",++o);189 }190 globfree(&pglob);191 192 }193 194 voID Lista(char *path)195 {196 struct stat pstat;197 glob_t pglob;198 char buf[BUFFSIZE]={};199 if(lstat(path,&pstat)<0)200 {201 perror("lstat()");202 return;203 }204 if(!S_ISDIR(pstat.st_mode))205 {206 printf("%s ",path);207 return;208 }209 DIR *dp=opendir(path);210 struct dirent *rd=NulL;211 while(1)212 {213 rd=readdir(dp);214 if(rd==NulL)215 {216 if(errno)217 {218 perror("readdir()");219 closedir(dp);220 return;221 }222 break;223 }224 printf("%s ",rd->d_name);225 }226 closedir(dp);227 printf("\n");228 return;229 }230 231 voID Listh(char *path)232 {233 struct stat pstat;234 glob_t pglob;235 char buf[BUFFSIZE]={};236 if(lstat(path,&pstat)<0)237 {238 perror("lstat()");239 return;240 }241 if(!S_ISDIR(pstat.st_mode))242 {243 printf("%s ",path);244 return;245 }246 DIR *dp=opendir(path);247 struct dirent *rd=NulL;248 while(1)249 {250 rd=readdir(dp);251 if(rd==NulL)252 {253 if(errno)254 {255 perror("readdir()");256 closedir(dp);257 return;258 }259 break;260 }261 if((rd->d_name)[0]==‘.‘)262 continue;263 printf("%s ",rd->d_name);264 }265 closedir(dp);266 printf("\n");267 }268 269 int main(int argc,char *argv[])270 {271 char *optstring="-l:i:a:h:";272 int a;273 while(1)274 {275 a=getopt(argc,argv,optstring); 276 if(a==-1)277 break;278 switch(a)279 {280 case ‘l‘:281 Listl(optarg);282 break;283 case ‘i‘:284 Listi(optarg);285 break;286 case ‘a‘:287 Lista(optarg);288 break;289 case ‘h‘:290 Listh(optarg);291 break;292 case ‘?‘:293 printf("不认识此选项%s\n",argv[optind-1]);294 break;295 case 1:296 printf("非选项参数%s\n",argv[optind-1]);297 break;298 default :299 break;300 }301 }302 return 0;303 }总结
以上是内存溢出为你收集整理的my-ls--初步调试全部内容,希望文章能够帮你解决my-ls--初步调试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)