仓酷云

标题: Linux设计Linux ll命令(ls -l)的代码完成仓酷云 [打印本页]

作者: 若相依    时间: 2015-1-18 11:29
标题: Linux设计Linux ll命令(ls -l)的代码完成仓酷云
不同版本的Linux命令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令。
$llwget
total544
drwxr-xr-x3orisunorisun40962011-12-1509:48./
drwxr-xr-x65orisunorisun40962011-12-2019:45../
drwxr-xr-x11orisunorisun40962011-08-0921:55wget-1.13/
-rw-r--r--1orisunorisun5407562011-12-1509:47wget.pdf
目次老是不为空,它最少包括两项:.代表以后路径,..代表父路径。
ll命令用于列出一个目次下的文件的具体信息:
上面会商怎样来编程完成ll命令。
文件的良多基础信息都能够经由过程体系挪用lstat来猎取,它前往一个布局体:
  1. structstat{dev_tst_dev;/*IDofdevicecontainingfile*/ino_tst_ino;/*inodenumber*/mode_tst_mode;/*protection*/nlink_tst_nlink;/*numberofhardlinks*/uid_tst_uid;/*userIDofowner*/gid_tst_gid;/*groupIDofowner*/dev_tst_rdev;/*deviceID(ifspecialfile)*/off_tst_size;/*totalsize,inbytes*/blksize_tst_blksize;/*blocksizeforfilesystemI/O*/blkcnt_tst_blocks;/*numberof512Bblocksallocated*/time_tst_atime;/*timeoflastaccess*/time_tst_mtime;/*timeoflastmodification*/time_tst_ctime;/*timeoflaststatuschange*/};
复制代码
一个structstat内里仿佛包括了我们编写ll命令所需的一切文件信息,但有些体现情势上还不合错误。
上面给出完全代码。
  1. #include<stdio.h>#include<time.h>#include<sys/types.h>#include<dirent.h>#include<sys/stat.h>#include<stdlib.h>#include<string.h>voiddo_ls(char[]);voiddostat(char*);voidshow_file_info(char*,structstat*);voidmode_to_letters(int,char[]);char*uid_to_name(uid_t);char*gid_to_name(gid_t);voidmain(intargc,char*argv[]){if(argc==1)do_ls(".");elseprintf("输出命令./ls便可,不要带任何参数。
  2. ");}voiddo_ls(chardirname[]){DIR*dir_ptr;//路径变量structdirent*direntp;//存储路径下一个子项信息的布局体if((dir_ptr=opendir(dirname))==0)fprintf(stderr,"ls:cannotopen%s
  3. ",dirname);else{while((direntp=readdir(dir_ptr))!=0)dostat(direntp->d_name);closedir(dir_ptr);}}voiddostat(char*filename){structstatinfo;if(lstat(filename,&info)==-1)perror("lstat");elseshow_file_info(filename,&info);}voidshow_file_info(char*filename,structstat*info_p){charmodestr[11];mode_to_letters(info_p->st_mode,modestr);printf("%-12s",modestr);printf("%-4d",(int)info_p->st_nlink);printf("%-8s",uid_to_name(info_p->st_uid));printf("%-8s",gid_to_name(info_p->st_gid));printf("%-8ld",(long)info_p->st_size);time_ttimelong=info_p->st_mtime;structtm*htime=localtime(&timelong);printf("%-4d-%02d-%02d%02d:%02d",htime->tm_year+1990,htime->tm_mon+1,htime->tm_mday,htime->tm_hour,htime->tm_min);printf("%s
  4. ",filename);}/*这个函数写得不敷周全,起首文件范例不全,其次没有思索suid,sgid,sticky*/voidmode_to_letters(intmode,charstr[]){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;}#include<pwd.h>//#include能够呈现在代码中的任何地位char*uid_to_name(uid_tuid){structpasswd*pw_str;staticcharnumstr[10];if((pw_str=getpwuid(uid))==NULL){sprintf(numstr,"%d",uid);//假如没有取得用户名,则间接把uid看成用户名returnnumstr;}elsereturnpw_str->pw_name;}#include<grp.h>char*gid_to_name(gid_tgid){structgroup*grp_ptr;staticcharnumstr[10];if((grp_ptr=getgrgid(gid))==NULL){sprintf(numstr,"%d",gid);returnnumstr;}elsereturngrp_ptr->gr_name;}
复制代码


<br>


常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基的。
作者: 乐观    时间: 2015-1-21 07:46
虽然大家都比较喜欢漂亮的mm,但是在学 linux 的过程中,还是要多和“男人”接触一下:P 遇到问题的时候,出来看说和上网查之外,就是要多用 linux 下的 man 命令找找帮助。
作者: 再见西城    时间: 2015-1-30 11:48
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
作者: 仓酷云    时间: 2015-2-3 12:48
在学习linux的工程中,linux学习方法有很多种,这里是小编的学习心得,给大家拿出来分享一下。
作者: 只想知道    时间: 2015-2-7 03:46
甚至目前许多应用软件都是基于它的。可是没有哪一个系统是十分完美的。
作者: 愤怒的大鸟    时间: 2015-2-7 10:06
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
作者: 深爱那片海    时间: 2015-2-11 19:12
生成新的unispimsp.ksc。”另外得到回复后如果问题解决,向帮助过你的人发个说明,让他们知道问题是怎样解决的。
作者: 不帅    时间: 2015-3-7 10:33
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
作者: 兰色精灵    时间: 2015-3-14 23:31
学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。
作者: 小女巫    时间: 2015-3-21 14:56
放手去搞。尽量不要提问,运用搜索找答案,或者看wiki,从原理上理解操作系统的本质,而不是满足于使用几个技巧。尽量看英文资料。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2