还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Linux下实现Is命令仅适用于Is-a pathname;Is Tpathname;Is pathname Is命令就是list的缩写,缺省下Is用来打印出当前目录的清单,如果I S指定其他目录,那么就会显示指定目录里的文件及文件夹清单通过Is命令不仅可以查看linux文件夹包含的文件.而且可以查看文件权限包括目录、文件夹、文件权限,查看目录信息等等,Is命令在日常的linux操作中用的很多-a选项表示显示该目录下的所有文件,包括隐藏文件-1选项表示显示文件的详细信息,包括方问权限,文件大小……例如Is-a/Is_I/1主要构造的函数void errorconst char*err string,int line;错误处理函数,打印错误所在行数和错误信息void Demonstrate attribute struct stat buf,char*name;获得文件属性并打印void Demonstratesi ngIe char*name;〃输出文件名,命令没有7选项输出文件名要保持上下对齐voidDemonstrateint flag,char*pathname;〃根据命令行参数和文件路径名来显示目标文件void Demonstrate dir int千lag parameter,char*path;〃为显示某个目录下的文件做准备2函数流程⑴获取该目录下文件的总数和最长文件名⑵假设获该目录下所有文件的文件名,存放于变量f i Ienames中⑶使用冒泡法对文件名按字母顺序存储于fi lenanes中⑷调用Demonstrate函数来显示每个文件信息3程序中主要的结构体参数struct stat*buf是一个保存文件状态信息的结构体A:struct stat{dev stdev;〃文件设备号ino t st ino;〃文件的i-nodemode tst mode;〃文件类型和存储权限nI inktstnI ink;〃连到该文件的硬链接数目uid tst uid〃文件所有者的用户idgid tst Mid;〃文件所有者的组iddev tst rdev〃假设此文件为设备文件,那么为其设备编号off tst size;〃文件大小bIksize tst bIksize;〃文件系统的I/O缓冲区大小bIkcnt tst bIocks;占用文件区块的个数time tst atime;〃文件最近一次被访问的时间文件最后一次被修改的时间t ime_tst_ct ime;〃文件最近一次被更改的时间}其中,对于st nxxJe包含的文件类型信息,P0SIX标准定义了一系列的宏S ISLNKst mode〃判断是否为符号链接S_lSREG st_mode〃判断是否为一般文件/***用Istat而不是stat以方便解析链接文件*/ifI stat pathname,buf=TI stat返回的是符号链接文件文件本身的4犬态信息error stat,_LINE_J;1------switch flagcase PARAMETER NONE:〃没有一I选项i fname
[0]!=.Demonstrate_s inglename;}break;case PARAMETERA://-a:显示包括隐藏文件在内的所有文件Demonstrate singlename;break;char path[PATH MAX+1];〃文件路径名char parameter
[32];〃保存命令行参数,目标文件名和目录名不在此列int flagparaneter PARAMETER_NONE;〃用来标志参数种类,即是否有T和-a选项struct stat buf;/*首先对命令行参数进行解析,即提取命令行参数中后的选项用户的输入有多样性,如ls-1-a;Is-lao我们用两层循环类来解析参数.外层循环对a rgv口数组中的元素依次进行内层循环的解析,二层循环对以二为首的字符串进行选项提取.并把每个选项存于parameter口数组当中,用nun记下的数目,以备后用而命令行参数中的总选项数目那么用j计数*/i=05num=0;for i=1;iargc;i++if argv[i]
[0]=,-1for k=1;kstr lenargv[i];k++parameter[j]=argv[i][k];〃获取一后面的参数保存到数组parameter■中J44-;1nuE;〃保存的个数1/*检查刚刚提取的选项是否合法并且用或运算记录参数,以备后用最后为选项数组的末尾元素赋,\01o*///check theargunent becauseof onIy supporti ng-a ang-I for i=0;ij;i++i f parameter[i]=1a1f Iag_parameter=PARAMETERA;cont i nue;,eIse i fparameter[i]二IfIag parameter=PARAMETER_L;continue;1eIsepr intf Hmy_lsinvaI idoption Tk\n”,parameter[i];exit1;;1[j]=\0*/*parameter由上面所知num记录的是参数中的数量,因此如果num+1=argc,那说明用户所输入的命令行参数不包含目录或文件名只是显示当前目录下的文件因为这是我们必须自动将path赋值为当前目录为了使其称为一个字符串,必须在末尾加然后进入Demonstrate_d i r函数.*///print theinformation ofcurrent directoryif thecannand withoutth ename oftarget fileandcurrent directoryif num+1=argc{strcpy path,/;〃/〃当前目录path
[2]=AO1Demonstrate_d i r fI ag_parameter,path;return0;1/*如果命令行参数包含目录或者文件名,那么我们要检查其合法性参数中的目录或者文件是否存在这里我们利用stat族函数来获取文件的属性,实现上述功能stat族函数通常有两个参数文件路径/文件描述符.struct stat*buf类型的结构体如果操作成功,那么buf将保存文件的属性假设合法,利用宏S ISDIRbuf.st mode,判断此文件是否为目录文件假设为目录文件那么进入Demonstrate dir函数,否那么进入Demonstrate函数通常情况,Demonstrated i r函数是获取path目录下所有文件的完整路径玄,在使每个文件执行Demons trate函数因此如果参数中是指定的文件名.那么可绕过Demonstrate_d ir函数,直接进入Demonstrate函数*/i=1;do{/*梆如果不是目标文件名或目录,解析下一个命令行参数*/if argv[i]
[0]=,J i『cont inue;1eIse strcpypath,argv[i];/*林如果目标文件或目录不存在,报错并退出程序*/i fstatpath,buf=-1error stat,_LINE_J;1ifS ISDIRbuf.st mode//argv[i]是一个目录〃如果目录的最后一^字符不是就加上7if path]strlenargv[i]-1]!=/path[strlen argv[i]]二/path[str lenargv[i]+1]=,\0;1e Ise path[str lenargv[i]]=\0f;Demonstrate_d ir fI ag_parameter,path;if1else〃argv[i]是一个文件Demonstrate fI ag_parameter,path;i++;}whi Ieiargc;return0;1/*料错误处理函数,打印出错误所在行的行数和错误信息*/void errorconst char*err_str ing,int I inefpr i ntf stderr,“I ine:%d n,I ine;perror err_str ing;exit1;1/***获取文件属性并打印*/void Demonstrate_attr i bute struct stat buf,char*name charbuf time
[32]〃存放时间struct passwd*psd;〃从该结构体中获取文件所有者的用户名struct group*grp;〃从该结构体中获取文件所有者所属组的组名/***获取并打印文件类型*/〃st mode:文件内容禾八存取权限if S_ISLNKbuf.stjnode〃判断是否为符号链接st_mode〃判断是否为文件printfCT;else ifS_ISREGbuf.pr i ntf;}st_mode判断是否为目录{else if S_ISDIRbuf.pri ntfd;else ifS_ISCHRbuf.st_mode〃判断是否为字符设备文件printf c;else ifS_ISBLKbuf.pr i ntf st_mode〃判断是否为块设备文件b;eIse i fS_ISFIFObuf.st_mode〃判断是否为先进先出的FIFO printfCT1;else ifS_ISSOCK buf.st_mode〃判断是否为socket printf〃s〃;/*林获取并打印文件所有者的权限*/if buf.st_modeS_IRUSRprintfO11;e Ise pr intf;if buf.st_modeS_lWUSR pr i ntfw;eIsepr i ntf;1i fbuf.st_modeS_IXUSR pr i ntfx;1else printf;林获取并打印与文件所有者同组的用户对该文件的操作权限*/if buf.st_modeS_IRGRPpr i ntf”r;1e Ise pr i ntf;1if buf.st_modeS_IWGRPpr intfCwH;1e Ise pr i ntf;1if buf.st_nDdeS_IXGRP pr i ntfC1x;e Isepr intf;/***获取并打印其它用户的对该文件的操作权限*/if buf.st_modeS_IR0TH printfO;1eIsepr i ntf C-H;if buf.st_modeS_lWOTH pr i ntfw;elsepr i ntf;if buf.st_modeS_IX0THprintfCx;1eIsefpr intf;1printfC,n;/***根据Uid与gid获取文件所有者的用户名与组名*/psd=Retpwu id buf.st uid;grp=getgrgid buf.st gid;printfCW,buf.st_nI ink;〃打印文件的链接数该文件硬链接数目pr intf/4r-9sH,psd-pw_name;//打印文件拥有者printf C/4r8s〃,grp-gr name;〃打印文件所属用户组printfH/c6d\intbuf.st si ze:〃才丁印文件的大小strepy buf time,ct imebuf.stmt ime;buftime[str I en buftime-1]=,\Of;//去掉换行符pr intfC1osn,buf_t ime;〃打印文件的时间信息/*在没有使用7选项时,打印一个文件名,打印时上下行之间进行对齐*/void Demonstrate_single char*namei nt i,len;/*料如果本行缺乏以打印一个文件名那么换行*/if g_leave_lengjnaxIenprintfCAn;g_leave_len=MAXROWLEN;1len=str lenname;I en=R max I en-I en;print1一,name;for i=0;ilen;i++pr intfC;printfC;/***下面的2指不空两格*/g_leave_len_g_maxI en+2;1/**根据命令行参数和完整路径名显示目标文件*参数flag:命令行参数*参数pathname:包含了文件名的路径名*/void Demonstrateint flag,char*pathname{int i,j;structstatbuf;char name[NAME_MAX+1];/***从路径中解析出文件名**/for i=0,j=0;istr len pathname;i++if pathname[i]=/i=0;continue;1name[j++]=pathname[i];1name[j]=\0;casePARAMETER L:〃-1:每个文件单独占一行,显示文件的详细属性信息ifname
[0]!=Demonstrate attr ibutebuf,name;printfC1%-s\nH,name;1breakjcase PARAMETERA+PARAMETERL:〃同时有-a和选项的情况Demonstrateattributebuf,name;printfC15{ns\nH,name;breakjdefault:break,}为显示目录下的文件做准备*/1/*void Demonstrate_d irint fIag_parameter,char*pathDIR*d ir;struct d i rent*ptr;intcount=0;char f i I enames
[256][PATH MAX+1],tenp[PATHMAX+1];获取该目录下文件总数和最长的文件名dir二opendir path;if dir=NULL error“opendir”,_LINE;1wh i Ie ptr二readd ir dir!=NULL if g max Ienstr lenptr-d nameRmax Ien=str Ienptr-d_name;count++;1c Iosed ir dir;ifcount256error toomany f i Iesunder this dirn,_LINE_;int i,i,Ien=str Ienpath;〃获取该目录下所有的文件名dir=opendir path;for i=0;icount;i++ptr=readd ir dir;ifptr=NULL errorreaddi rn,_LINE_;strncpv f i1enames[i],path,Ien;//f i I enames存放目录下的所有文件名f ilenames[i][Ien]=*\0;str catf i I enames[i].ptr-d name;f iI enames[i][len+str Ienptr-d_name]Zl5\05;〃使用冒泡法对文件名进行排序,排序后文件名按字母顺序存储于千i lenarfsfori=0;icount-1;i++for j=0;jcount-1-i;j++ifstrcnp f iI enames[j],f iI enames[j+1]0strcpv tenp.f iI enames[j+1];temp[str Ien f iI enames[i+1]]=,\0f;strcpv fiI enames[i+1],filenames[j];fiIenames[j+1][str IenfiIenames[j]]=1\0;strcpv fiIenames[j],tew:fiIenames[j][str Ienterrp]=\0;1fori=0icount;i++Demonstrate fI agjarameter,fiIenames[i];「I Ir,〃如果命令行$没有T选项,打印一个换行符ifflag parameterPARAMETER」二0pr intfXn11;附录资料:不需要的可以自行删除AbstractBased onthe comprehensiveanalysis onthe plasticparts structureservice requirement,mounding qualityand mouldmenu factoringcost.A correspondinginjection mouldof internalside core pulling was designed.By adoptingthe multidirectionand multi-combinationcore-pulling.A correspondinginjection mouldof internalsidecorepullingwasdesigned,the workingprocess ofthe mouldwas introduced语言详解-枚举类型注以下全部代码的执行环境为C VC++
6.0在程序中,可能需要为某地整数定义一个别名,我们可以利用预处理指令来完成这项工作,#define您的代码可能是#define MONIdefine TUE2#define WED3define THU4#define FRI5define SAT6在此,我们定义一种新的数据类型,希望它能完成同样的工作这种新的数据类型叫枚#define SUN7举型.定义一种新的数据类型一枚举型1以下代码定义了这种新的数据类型一枚举型enum DAY{MON=LTUE,WED,THU,FRI,SAT,SUN};⑴枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项⑵DAY⑶第一个枚举成员的默认值为整型的后续枚举成员的值在前一个成员上加0,1⑷可以人为设定枚举成员的值,从而自定义某个范围内的整数⑸枚举型是预处理指令#的替代“⑹类型定义以分号;结束define.使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了我们已经见过最基本2的数据类型,如整型单精度浮点型双精度浮点型字符型短整型等等用int,float,double,char,short这些基本数据类型声明变量通常是这样〃变量的类型均为字符型char a;a charcharletter;inix,y,〃变量和的类型均为整型z;x,y zint intnumber;double m,n;变量的类型为双精度浮点型既然枚举也是一种数据类型,那么它和基本数double result;result double据类型一样也可以对变量进行声明方法■:枚举类型的定义和变量的声明分开enum DAYMON=1,TUE,WED.THU,FRI,SAT,SUN};enum DAYyesterday;enum DAYtoday;〃变量的类型为枚举型〃变量和enum DAYtomorrow;omorrow enum DAYenum DAYgood day,bad day;good daybad的类型均为枚举型方法二类型定义与变量声明同时进行day enum DAY〃跟第一个定义不同的是,此处的标号省略,这是允许的{Saturday,sunday=0,enum DAYmonday,luesday,Wednesday,thursday,friday〃变量的类型为枚举型}workday;workday enum DAYenum week{Mon=l,Tue,Wed.Thu.Fri Sal,Sun}〃变量的类型为枚举型days;days enumweek,f定义枚举类型并声明了两个枚举型变量方法三用enum BOOLEAN{false,true}end flag,malch flag;typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明typcdef enuniworkday〃此处的为枚举型Saturday,sunday=0,monday,tuesday,Wednesday,thursday,friday}workday;workday的别名enum workday〃变量和的类型为枚举型也即workday today,tomorrow;today tomorrowworkday,enum workdayenurnworkday中的可以省略:workdaytypcdcf enum{Saturday,sunday=0,monday,tuesday,Wednesday,thursday,Friday〃此处的为枚举型的别名〃变量和}workday;workday enum workday workday today,tomorrow;today tomorrow的类型为枚举型也即也可以用这种方式workday,enum workdaytypedef enum workday|Saturday,sunday=0,inonday,tuesday,Wednesday,thursday,friday1;workdaytoday,tomorrow;〃变量today和tomorrow的类型为枚举型workday,也即enumworkday注意同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量错误例如如下所示错误声明一存在同名的枚举类型typedef enum{Wednesday,thursday,friday}workday;typedef enumWEEK Saturday,错误声明二存在同名的枚举成员sunday=0,nionday,}workday;typedef enum{Wednesday,thursday,fridayworkday J;typedefenumWEEK{使用枚举类型的变量Wednesday,sunday=0,monday,}workday_2;.对枚举型的变量赋值
2.1实例将枚举类型的赋值与基本数据类型的赋值进行了比照方法一先声明变量,再对变量赋值#includestdio.h/*定义枚举类型*/enum DAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};void main/*使用基本数据类型声明变显,然后对变显赋值*/int x,y,z;x=10;y=20;z=30;/*使用枚举类型声明变量,再对枚举型变量赋值*/enum DAYyesterday,today,tomorrow;yesterday=MON;today=TUE;tomorrow=WED;〃,printf,%d%d%d\n yesterday,today,tomorrow;方法二声明变量的同时赋初值均.1皿0stdio.h/*定义枚举类型*/enum DAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};void main{/*使用基本数据类型声明变量同时对变量赋初值*/int x=10,y=20,z=30;/*使用枚举类型声明变量同时对枚举型变量赋初值*/enum DAYyesterday=MON,today=TUE,tomorrow=WED;方法三定义类型的同时声明变量,然后对变量赋printf z,%d%d%d\n,\yesterday,today,tomorrow;值〈〉/*定义枚举类型,同时声明该类型的三个变量,它们都为全局变量*/include stdio.h定义三个具有基本数据类型的变enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN}yesterday,today,tomorrow;/*量,它们都为全局变量*/int x,y,z;void main/*对基本数据类型的变量赋值*/x=10;y=20:z=30;/*对枚举型的变量赋值*/yesterday=MON;today=TUE;tomorrow=WED;〃,〃输出printf,z%d%d%d\n x,y,z;102030〃输出printf z/%d%d%d\n\yesterday,today,tomorrow;123方法四类型定义,变量声明,赋初值同时进行〈〉/*定义枚举类型,同时声明该类型的三个变量,并赋初值它们都为全局变量*/include stdio.henum DAY{M0N=I,TUE,WED,THU,FR1,SAT,SUN定义三个具有基本数据类型的变量,并赋初值它们都为全局yesterday=MON,today=TUE,tomorrow=WED;/*变量*/int x=10,y=20,z=30;void main〃,〃输出printf/z%d%d%d\n x,y,z;102030〃,〃输出printf z,%d%d%d\n yesterday,today,tomorrow;123对枚举型的变量赋整数值时,需要进行类型转换
2.2#include stdio.henum DAY{MON=1,TUE,WED,THU.FRI,SAT.SUN;void main{enumDAYyesterday,today,tomorrow;yesterday=TUE;〃类型转换today=enumDAYyesterday+1;二z/类型转换tomorrow enumDAY30;〃错误//tomorrow=3;〃输出使用枚举型变量printf z/%d%d%d\n,\yesterday,today,tomorrow;2330I#includestdio.henum[BELL-W,BACKSPACE=\b,HTAB=\t,RETURN=,\r;NEWLINE=\n,VTAB=W,二〃SPACE enum BOOLEAN{FALSE=0,TRUE}match_flag;void mainintindex=0;int count_ofllcttcr=0;int count_oOpace=0;〃;char str[]=〃Im Elyefodmatchflag=FALSE;for;str[index]!=O;index++if SPACE!=str[index]count oflletter++;else matchflag=enuni BOOLEAN1;countoflspace++;〃,printf/z%s%d times%c match flag”match”:〃not match”,count_ofIspace,NEWLINE;printf countof letters:%d%c%c,z,count oLletter,NEWLINE,RETURN;输出1match2timescount ofletters:10枚举类型与运算符Press anykey tocontinue4,sizeof#include stdio.henum escapes二BELLBACKSPACE=\b,HTAB=*\t,RETURN=\r;NEWLINE=\n,二VTAB\v\SPACE=〃};enum BOOLEAN{FALSE=0,TRUE}matchflag;void main〃,〃,printf,z%d bytes\n sizeofenum escapes;//4bytes printf〃%d bytes\n sizeofescapes;//4bytes〃,printf z/%d bytes\n sizeofenumBOOLEAN;〃4bytes〃,printf,z%d bytes\n sizeofBOOLEAN;//4bytesprintf,z%d bytes\n〃,sizeof match_flag;//4bytesS ISDIRst mode〃判断是否为目录文件S ISOP st mode〃判断是否为字符设备文件S IBLKst mode〃判断是否为块设备文件S ISFIFOst mode〃判断是否为先进先出FIFOS ISFOCKstmode〃判断是否为socket8:struct passwd*psd;〃从该结构体中获取文件所有者的用户名C:structgroup*grp;〃从该结构体中获取文件所有者所属组的组名4心得体会本次课程设计我写的是Linux下的Is命令,通过这次课程设计,不仅使我对Is命令有了更深一层的认识,还认识到了系统提供的命令实现的途径和方法之前总是使用系统命令,如今自己编程实现了一些命令,每次使用系统提供的命令和调用自己编写的命令感觉大不相同5具体解析与详细代码#incIude stdio.h#include stdIib.h#i ncIudestr ing.h#i ncIudet ime.h#i ncIudesys/stat.h#i ncIudeun istd.h#i ncIudesys/types.h i ncIude1i nux/1imits.h#i ncIudedirent.h incIude grp.h#incIudepwd.h incIude errno.h#define PARAMETERNONE0〃无参数define PARAMETERA1//-a:显示所有文件#define PARAMETERL2//T:一行显示一个文件的详细信息define MAXROWLEN80〃一行显示的最多字符数intR Ieave Ien二MAXROWLEN;〃一行剩余长度,用于输出对齐intgmaxIen;〃存放某目录下最长文件名的长度void errorconst char*err_str ing,intIine;〃专酊吴处理函数,打印4酊吴所在行数人错误信息vo id Demonstrateattribute structstatbuf,char*name;〃获取文件属性并打印void Demonstratesingle char*name;〃输出文件名,命令没有T选项,那么输出文件名时要保持上下文对齐void Demonstrateint f Iag,char*pathname;/〃艮一令行豺攵牙口文彳牛*各径名显示目标文件vo id Demonstrate_dirintfI ag_parameter,char*path;〃为显7K某个目录下的文件做准备—k int mainintargc,char**argv inti,j,k,nun;〃,printf z,%d bytes\n sizeofSPACE;//4bytes〃,printf z,%d bytes\n sizeofNEWLINE;//4bytes〃,printf〃%d bytes\n sizeofFALSE;//4bytes〃,printf z,%d bytes\n sizeof0;//4bytes综合举例#行〈匝
5.111135±
0.h enumSeasonspring,sunimer=100,fall=96,winter1;typedef enumMonday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday IWeekday;void main/*Season*/〃,printf〃%d\n spring;//0〃,printf z/%d,%c\n summer,summer;//100,dprintf z,%d\n\fall+winter;//193Season mySeason=winter;ifwinter-mySeasonprintf^myScason iswinter\n〃;//myScason iswinter intx=10;if x==summerprintf/zx isequal tosummer\n/;〃x isequal tosummer〃,printf〃%d bytes\n sizeofspring;//4bytes/*Weekday*/〃,printfsizeof Weekdayis:%d\n sizeofWeekday;//sizeof Weekdayis:4Weekday today=Saturday;Weekday tomorrow;二二if todayMondaytomorrow=Tuesday;elsetomorrow=Weekday today+1;//remember toconvert fromint toWeekday本文来自博客CSDN・.xiaobai32966。
个人认证
优秀文档
获得点赞 0