编写 ls
刺猬@http://blog.csdn.net/littlehedgehog
这几天加紧把这本《Understanding Unix/Linux Programming》看完,主要是为了熟悉下linuxAPI 的调用,上学期读linux 0.11版代码其实就吃了这个亏,不熟悉API,导致阅读代码比较困难。暂时把linux2.4内核代码的研究放一放。
还记得上次做windows API 也好像做了个列文件目录吧,这里又来做一次~
- #include <stdio.h>
- #include <dirent.h>
- #include <pwd.h>
- #include <grp.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- char *uid_to_name(uid_t uid)
- {
- /* 注意 这里声明的是static 这个就不会是在栈中分配了 生命期是整个进程 */
- static char numstr[12];
- struct passwd *pw_ptr;
- if((pw_ptr=getpwuid(uid))==NULL)
- {
- sprintf(numstr,"%d",uid);
- return numstr;
- }
- else
- return pw_ptr->pw_name;
- }
- char *gid_to_name(gid_t gid)
- {
- struct group *grp_ptr;
- static char numstr[12];
- if((grp_ptr=getgrgid(gid))==NULL)
- {
- sprintf(numstr,"%d",gid);
- return numstr;
- }
- else
- return grp_ptr->gr_name;
- }
- /* 这里是把文件属性 转化为字符 */
- void mode_format(unsigned int mode ,char *str)
- {
- strcpy(str,"----------");
- if(S_ISDIR(mode)) str[0]='d';
- if(S_ISCHR(mode)) str[0]='c';
- if(S_ISBLK(mode)) str[0]='b';
- if(mode & S_IRUSR) str[1]='r';
- if(mode & S_IWUSR) str[2]='w';
- if(mode & S_IXUSR) str[3]='x';
- if(mode & S_IRGRP) str[4]='r';
- if(mode & S_IWGRP) str[5]='w';
- if(mode & S_IXGRP) str[6]='x';
- if(mode & S_IROTH) str[7]='r';
- if(mode & S_IWOTH) str[8]='w';
- if(mode & S_IXOTH) str[9]='x';
- }
- void show_file(char *file_name,struct stat *stat_ptr)
- {
- //定义转化权限 目录+属性+'/0'
- char *mode[11];
- if(stat_ptr)
- {
- mode_format(stat_ptr->st_mode,mode);
- printf("%s",mode);
- printf("%4d ",stat_ptr->st_nlink);
- printf("%-8s ",uid_to_name(stat_ptr->st_uid));
- printf("%-8s ",gid_to_name(stat_ptr->st_gid));
- printf("%8ld",stat_ptr->st_size);
- printf("%.12s",10+ctime(&stat_ptr->st_mtime));
- printf("%s/n",file_name);
- }
- }
- void do_stat(char *file_name)
- {
- struct stat file_info;
- if(stat(file_name,&file_info)!=-1)
- {
- show_file(file_name,&file_info);
- }
- }
- void show_list(char *dir_name)
- {
- char filename[32];
- DIR *dir_ptr;
- struct dirent *dirent_ptr;
- if ((dir_ptr=opendir(dir_name))==NULL)
- {
- fprintf(stderr,"Cannot open %s :",dir_name);
- perror("");
- }
- else
- {
- while((dirent_ptr=readdir(dir_ptr))!=NULL)
- {
- strcpy(filename,dir_name);
- strcat(filename,dirent_ptr->d_name);
- do_stat(filename);
- }
- closedir(dir_ptr);
- }
- }
- int main(int argc, char* argv[])
- {
- if (argc==1)
- show_list(".");
- else
- show_list(*++argv);
- return 0;
- }