编写 ls

编写 ls

刺猬@http://blog.csdn.net/littlehedgehog






这几天加紧把这本《Understanding Unix/Linux Programming》看完,主要是为了熟悉下linuxAPI 的调用,上学期读linux 0.11版代码其实就吃了这个亏,不熟悉API,导致阅读代码比较困难。暂时把linux2.4内核代码的研究放一放。



还记得上次做windows API 也好像做了个列文件目录吧,这里又来做一次~

  1. #include <stdio.h>
  2. #include <dirent.h>
  3. #include <pwd.h>
  4. #include <grp.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. char *uid_to_name(uid_t uid)
  8. {
  9.     /* 注意 这里声明的是static 这个就不会是在栈中分配了 生命期是整个进程 */
  10.     static char numstr[12];
  11.     struct passwd *pw_ptr;
  12.     if((pw_ptr=getpwuid(uid))==NULL)
  13.         {
  14.             sprintf(numstr,"%d",uid);
  15.             return  numstr;
  16.         }
  17.     else
  18.         return  pw_ptr->pw_name;
  19. }
  20. char *gid_to_name(gid_t gid)
  21. {
  22.     struct group    *grp_ptr;
  23.     static char     numstr[12];
  24.     if((grp_ptr=getgrgid(gid))==NULL)
  25.         {
  26.             sprintf(numstr,"%d",gid);
  27.             return numstr;
  28.         }
  29.     else
  30.         return grp_ptr->gr_name;
  31. }
  32. /* 这里是把文件属性 转化为字符 */
  33. void mode_format(unsigned int mode ,char *str)
  34. {
  35.     strcpy(str,"----------");
  36.     if(S_ISDIR(mode))   str[0]='d';
  37.     if(S_ISCHR(mode))   str[0]='c';
  38.     if(S_ISBLK(mode))   str[0]='b';
  39.     
  40.     if(mode & S_IRUSR)  str[1]='r';
  41.     if(mode & S_IWUSR)  str[2]='w';
  42.     if(mode & S_IXUSR)  str[3]='x';
  43.     
  44.     if(mode & S_IRGRP)  str[4]='r';
  45.     if(mode & S_IWGRP)  str[5]='w';
  46.     if(mode & S_IXGRP)  str[6]='x'
  47.     
  48.     if(mode & S_IROTH)  str[7]='r';
  49.     if(mode & S_IWOTH)  str[8]='w';
  50.     if(mode & S_IXOTH)  str[9]='x';
  51. }
  52. void show_file(char *file_name,struct stat *stat_ptr)
  53. {
  54.     //定义转化权限 目录+属性+'/0'
  55.     char *mode[11];
  56.     
  57.     if(stat_ptr)
  58.     {
  59.         mode_format(stat_ptr->st_mode,mode);
  60.         printf("%s",mode);
  61.         printf("%4d ",stat_ptr->st_nlink);
  62.         printf("%-8s ",uid_to_name(stat_ptr->st_uid));
  63.         printf("%-8s ",gid_to_name(stat_ptr->st_gid));
  64.         printf("%8ld",stat_ptr->st_size);
  65.         printf("%.12s",10+ctime(&stat_ptr->st_mtime));
  66.         printf("%s/n",file_name);
  67.     }
  68. }
  69. void do_stat(char *file_name)
  70. {
  71.     struct stat file_info;
  72.     if(stat(file_name,&file_info)!=-1)
  73.     {
  74.         show_file(file_name,&file_info);
  75.     }
  76. }
  77. void show_list(char *dir_name)
  78. {
  79.     char filename[32];
  80.     DIR *dir_ptr;
  81.     struct dirent *dirent_ptr;
  82.     
  83.     if ((dir_ptr=opendir(dir_name))==NULL)
  84.     {
  85.         fprintf(stderr,"Cannot open %s :",dir_name);
  86.         perror("");
  87.     }
  88.     else
  89.     {
  90.         while((dirent_ptr=readdir(dir_ptr))!=NULL)
  91.             {
  92.                 strcpy(filename,dir_name);
  93.                 strcat(filename,dirent_ptr->d_name);
  94.                 do_stat(filename);
  95.             }
  96.         closedir(dir_ptr);
  97.     }
  98. }
  99. int main(int argc, char* argv[])
  100. {
  101.     if (argc==1)
  102.         show_list(".");
  103.     else
  104.         show_list(*++argv);
  105.     return 0;
  106. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值