白癜风专家坐诊 http://pf.39.net/bdfyy/zqbdf/200921/8231855.html
后端有时候rm,会出现一些问题。
这里作为一个子问题,讨论一下rm之后,发生的一些事。
打开rm源码:
[qianzichen
dev03v/src/app/coreutils/coreutils-8.21]visrc/rm.c从main函数开始:
intmain(intargc,char**argv){...while((c=getopt_long(argc,argv,"dfirvIR",long_opts,NULL))!=-1){switch(c){casef:x.interactive=RMI_NEVER;break;...}}...enumRM_statusstatus=rm(file,x);}
首先解析命令行参数,然后调用了rm:
enumRM_statusstatus=rm(file,x);
作者把rm函数的实现从rm.c中抽了出来,放在remove.c中:
/*RemoveFILEs,honoringoptionsspecifiedviaX.ReturnRM_OKifsuccessful.*/enumRM_statusrm(char*const*file,structrm_optionsconst*x){enumRM_statusrm_status=RM_OK;if(*file){FTS*fts=xfts_open(file,bit_flags,NULL);while(1){...}}...}
file参数是一个只读指针数组,代表要删除的文件名列表,x参数的结构定义如下,存储从命令行中解析后的rm的选项。
structrm_options{/*Iftrue,ignorenonexistentfiles.*/boolignore_missing_files;/*Iftrue,querytheuseraboutwhethertoremoveeachfile.*/enumrm_interactiveinteractive;.../*Iftrue,recursivelyremovedirectories.*/boolrecursive;boolrequire_restore_cwd;};
当file列表存在时,rm调用xfts_open:
FTS*xfts_open(char*const*argv,intoptions,int(*