《自己实现linux下ls命的代码.doc》由会员分享,可在线阅读,更多相关《自己实现linux下ls命的代码.doc(7页珍藏版)》请在金锄头文库上搜索。
1、自己实现linux下ls命令的代码/*CopyRight, (C) 2012*ls命令很常用,但很少人知道内部实现,更别说自己来实现了*本文目的为实现一个简单的ls命令:包括:a、l参数解析,文*件、目录等属性解析,也是学习IO操作的好例子。*/#include #include #include #include #include #include #include #include #include #include int do_ls(char *dir,char *filename,int lflag)int n;struct stat buf;char out100;struct p
2、asswd *pw;struct group *gr;struct tm *t;if(lflag = 0)/如果不带l参数,直接显示文件/目录名printf(%st,filename);return 0;if(lstat(dir,&buf)=0;n-)/打印文件的读写属性:读r、写w、执行x、无权限-if(buf.st_mode&(1pw_name);gr = getgrgid(buf.st_gid);/所属组名printf( %s,gr-gr_name);printf( %ld,buf.st_size);/字节计总大小t = localtime(&buf.st_atime);/最后一次访问时
3、间printf( %d-%d-%d %d:%d,t-tm_year+1900,t-tm_mon+1,t-tm_mday,t-tm_hour,t-tm_min); printf( %s ,filename); if(S_ISLNK(buf.st_mode)/判断是否为链接,是返回真printf( - );if(readlink(filename,out,100)=-1)/printf(readlink errorn);printf(%s,out);printf(n);return 0;int ls_prepare(char *w,int aflag,int lflag)/ls的准备工作struc
4、t stat buf;/man lstat可以看到此结构char name100;DIR *dir;/类似打开文件的fd描述符struct dirent *pdr;/man readdir可以看到此结构if(lstat(w,&buf)d_name0=.)continue;memset(name,0,100);strcpy(name,w);/拷贝strcat(name,/);/追加strcat(name,pdr-d_name);do_ls(name,pdr-d_name,lflag);else/有a参数显示所有memset(name,0,100);strcpy(name,w);strcat(na
5、me,/);strcat(name,pdr-d_name);do_ls(name,pdr-d_name,lflag);closedir(dir);else/为文件则直接显示do_ls(w,w,lflag);return 0;int main(int argc,char *argv)int aflag =0;int lflag =0;char c;int i;while(c = getopt(argc,argv,al)!=-1)/解析命令行参数,即-/-后面的字符串和给定的字符串匹配,有未解析字母返回字母或问号(取决于第3个参数),否则返回-1switch(c)/此处仅匹配a(所有)和l(列表),即只支持参数a、lcase a:aflag =1;break;case l:lflag =1;break;default:break;if(argc = optind )/optind系统变量,执行命令参数的个数(不包括命令,奇怪的是无参情况下他为1),判断argc是否为1,是则取当前路径,让我们显得更专业点ls_prepare(./,aflag,lflag);elsefor(i=optind;iargc;i+)/所有目录都传进去ls_prepare(argvi,aflag,lflag);printf(n);return 0;