下面是ls -l的简单实现,还有很多不完善的地方,如没有进行排序等。
#include<stdio.h> #include<dirent.h> #include<sys/types.h> #include<sys/stat.h> #include<stdlib.h> #include<pwd.h> #include<grp.h> #include<time.h> #include<string.h> void do_ls(char *); void do_stat(char *); void show_file_info(char *, struct stat *); void transfer_mode(mode_t, char mode_str[]); char * uid_to_name(uid_t uid); char * gid_to_name(gid_t gid); int main(int argc, char **argv) { if(argc == 1) do_ls("."); else while(--argc) { printf("%s:\n", *++argv); do_ls(*argv); } return 0; } void do_ls(char *path) { char * filename; DIR * dir_ptr; struct dirent * dirent_ptr; if((dir_ptr = opendir(path)) == NULL) { perror("opnedir"); exit(1); } while((dirent_ptr = readdir(dir_ptr)) != NULL) { do_stat(dirent_ptr->d_name); } closedir(dir_ptr); } void do_stat(char *filename) { struct stat info; if(stat(filename, &info) == -1) perror("stat"); else show_file_info(filename, &info); } void show_file_info(char *filename, struct stat *info) { char mode_str[11]; transfer_mode(info->st_mode, mode_str); printf("%s", mode_str); printf("%4d", (int)info->st_nlink); printf("%8s", uid_to_name(info->st_uid)); printf("%8s", gid_to_name(info->st_gid)); printf("%8ld", info->st_size); printf("%15.12s", ctime(&info->st_mtime) + 4); printf("%15s\n", filename); } char * uid_to_name(uid_t uid) { struct passwd *pwd; static char user_id[10]; if((pwd = getpwuid(uid)) == NULL) { sprintf(user_id, "%d", uid); return user_id; } else return pwd->pw_name; } char * gid_to_name(gid_t gid) { struct group *group; static char group_id[10]; if((group = getgrgid(gid)) == NULL) { sprintf(group_id, "%d", gid); return group_id; } else return group->gr_name; } void transfer_mode(mode_t mode, char mode_str[]) { strcpy(mode_str, "----------"); if(S_ISDIR(mode)) mode_str[0] = ‘d‘; if(S_ISCHR(mode)) mode_str[0] = ‘c‘; if(S_ISBLK(mode)) mode_str[0] = ‘b‘; if(S_ISLNK(mode)) mode_str[0] = ‘l‘; if(S_ISFIFO(mode)) mode_str[0] = ‘p‘; if(S_ISSOCK(mode)) mode_str[0] = ‘s‘; if(mode & S_IRUSR) mode_str[1] = ‘r‘; if(mode & S_IWUSR) mode_str[2] = ‘w‘; if(mode & S_IXUSR) mode_str[3] = ‘x‘; if(mode & S_IRGRP) mode_str[4] = ‘r‘; if(mode & S_IWGRP) mode_str[5] = ‘w‘; if(mode & S_IXGRP) mode_str[6] = ‘x‘; if(mode & S_IROTH) mode_str[7] = ‘r‘; if(mode & S_IWOTH) mode_str[8] = ‘w‘; if(mode & S_IXOTH) mode_str[9] = ‘x‘; }