说明:此代码并不是实现完整的 ls 命令
// filename:myls_l.cpp #include <iostream> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <pwd.h> #include <grp.h> #include <time.h> #include <string> int main(int argc, char *argv[]) { using std::cout; using std::endl; using std::string; struct stat st; struct passwd *wd; struct group *gp; string tm; int ret = stat(argv[1], &st); if(ret == -1) { cout << "open error" << endl; return -1; } if(S_ISREG(st.st_mode)) cout << "-"; else if(S_ISDIR(st.st_mode)) cout << "d"; else if(S_ISCHR(st.st_mode)) cout << "c"; else if(S_ISBLK(st.st_mode)) cout << "b"; else if(S_ISLNK(st.st_mode)) cout << "l"; else if(S_ISFIFO(st.st_mode)) cout << "f"; else if(S_ISSOCK(st.st_mode)) cout << "s"; if (st.st_mode & S_IRUSR) cout << "r"; else cout << "-"; if (st.st_mode & S_IWUSR) cout << "w"; else cout << "-"; if (st.st_mode & S_IXUSR) cout << "x"; else cout << "-"; if (st.st_mode & S_IRGRP) cout << "r"; else cout << "-"; if (st.st_mode & S_IWGRP) cout << "w"; else cout << "-"; if (st.st_mode & S_IXGRP) cout << "x"; else cout << "-"; if (st.st_mode & S_IROTH) cout << "r"; else cout << "-"; if (st.st_mode & S_IWOTH) cout << "w"; else cout << "-"; if (st.st_mode & S_IXOTH) cout << "x"; else cout << "-"; cout << " " << st.st_nlink; wd = getpwuid(st.st_uid); cout << " " << wd->pw_name; gp = getgrgid(st.st_gid); cout << " " << gp->gr_name; cout << " " << st.st_size; tm = ctime(&st.st_mtime); cout << " " << tm.substr(4, 12); cout << " " << argv[1] << endl; return 0; }
调用方法:
$ g++ -o myls_l myls_l.cpp $ ./myls_l myls_l.cpp