选择java 进入自由开放的国度

随笔 - 49, 文章 - 3, 评论 - 154, 引用 - 1
数据加载中……

linux中命令ls的实现

基本实现了明令ls -l的功能,能显示列表,但还有如下缺陷:结果没有排序,不能显示总大小,不能显示其他目录下的文件列表。

程序中使用了掩码的技术来实现数值到文件类型、文件权限列表字符串的转换,使用命令getpwuid(uid_t uid)将用户id转换为名子,使用getgrgid(gid_t gid)将组id转换为组名。

下面是代码:
  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <dirent.h>
  5 #include <string.h>
  6 
  7 void do_ls(char[]);
  8 void dostat(char *);
  9 void show_file_info(char *filename, struct stat *buf);
 10 void mode_to_letters(intchar[]);
 11 char *uid_to_name(uid_t);
 12 char *gid_to_name(gid_t);
 13 
 14 main(int ac, char *av[])
 15 {
 16   if (ac == 1)
 17       do_ls(".");
 18   else
 19       while(--ac)
 20       {
 21         printf("%s: \n"*++av);
 22         do_ls(*av);
 23       }
 24 }
 25 
 26 void do_ls(char dirname[])
 27 {
 28   /*
 29    * list files in directory called dirname
 30    */
 31    
 32   DIR *dir_ptr;             //the directory
 33   struct dirent *direntp;   //each entry
 34   
 35   if( (dir_ptr = opendir(dirname)) == NULL)
 36      fprintf(stderr, "ls1:cannot open %s\n", dirname);
 37   else
 38   {
 39     while ( (direntp = readdir(dir_ptr)) != NULL)
 40         dostat(direntp->d_name);
 41     
 42     closedir(dir_ptr);
 43   }
 44   
 45 }
 46 
 47 
 48 void dostat(char *filename)
 49 {
 50   struct stat info;
 51   if (stat(filename, &info) == -1)
 52      perror(filename);
 53   else
 54      show_file_info(filename, &info);
 55 }
 56 
 57 void show_file_info(char *filename, struct stat *buf)
 58 {
 59   /*
 60    * display some info stat in a name = value formant
 61    */
 62    char *uid_to_name(uid_t);
 63    char * ctime(time_t *);
 64    char * gid_to_name(gid_t), filemode();
 65    //void mode_to_letters();
 66    char modestr[11];
 67    
 68    mode_to_letters(buf->st_mode, modestr);
 69    
 70    printf("%s", modestr);
 71    printf("%4d",  buf->st_nlink);
 72    printf("%-8s",   uid_to_name(buf->st_uid));
 73    printf("%-8s",  gid_to_name(buf->st_gid));
 74    printf("%8ld",   (long)buf->st_size);
 75    //printf("modtime:%d\n",buf->st_mtime);
 76    printf("%.12s",4+ctime(&buf->st_mtime));
 77    printf("%s\n", filename);  
 78    
 79 }
 80 
 81 /*
 82  * utility functions
 83  */
 84 
 85 void mode_to_letters(int mode, char str[])
 86 {
 87   strcpy(str, "----------");
 88   
 89   if(S_ISDIR(mode)) str[0= 'd';
 90   if(S_ISCHR(mode)) str[0= 'c';
 91   if(S_ISBLK(mode)) str[0= 'b';
 92   
 93   if(mode & S_IRUSR) str[1= 'r';
 94   if(mode & S_IWUSR) str[2= 'w';
 95   if(mode & S_IXUSR) str[3= 'x';
 96   
 97   if(mode & S_IRGRP) str[4= 'r';
 98   if(mode & S_IWGRP) str[5= 'w';
 99   if(mode & S_IXGRP) str[6= 'x';
100   
101   if(mode & S_IROTH) str[7= 'r';
102   if(mode & S_IWOTH) str[8= 'w';
103   if(mode & S_IXOTH) str[9= 'x';  
104 }
105 
106 #include <pwd.h>
107 
108 char *uid_to_name(uid_t uid)
109 /*
110  * returns pointer to username associated with uid, uses getpw()
111  */
112 {
113   struct passwd  *pw_ptr;
114   static char numstr[10];
115   
116   if( (pw_ptr = getpwuid(uid)) == NULL)
117   {
118     printf(numstr, "%d", uid);
119     return numstr;
120   }
121   else
122     return pw_ptr->pw_name;
123 }
124 
125 #include <grp.h>
126 
127 char *gid_to_name(gid_t gid)
128 {
129   struct group *grp_ptr;
130   static char numstr[10];
131   
132   if ((grp_ptr = getgrgid(gid)) == NULL)
133   {
134     sprintf(numstr, "%d", gid);
135     return numstr;
136   }
137   else
138     return grp_ptr->gr_name;
139 }
140   
141 

争取早日将其他功能实现。

posted on 2006-03-27 08:47 soochow_hhb 以java论成败 以架构论英雄 阅读(1480) 评论(2)  编辑  收藏 所属分类: Reading

评论

# re: linux中命令ls的实现  回复  更多评论   

阁下的代码很眼熟啊
2006-11-04 16:06 | 1jjk

# re: linux中命令ls的实现  回复  更多评论   

顺便问一下
实现ls -l /dev
怎么做呢?
2006-11-04 16:07 | 1jjk

只有注册用户登录后才能发表评论。


网站导航: