打开文件太多ubuntu树命令模拟

时间:2013-12-24 13:03:52

标签: c ubuntu tree simulation

打开的文件太多了?它确实打开了我想要的东西(至少我是这么认为),问题是我得到了一个无限循环,而且有太多打开的文件出错了,请给我一点帮助,或指针哪里弄错了?(包括“,”!)

#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<sys/types.h>
#include<time.h>
#include<dirent.h>
#include<string.h>
int listdir(const char *nf);
int fileinfo(const char *nf,const char *da){
  struct stat s; struct passwd *pp;
  if(stat(nf,&s)==-1)return -1;
  if((pp=getpwuid(s.st_uid))==NULL)return -1;
  if((s.st_mode & S_IFMT) == S_IFDIR) listdir(da);
  printf(" %s\n",nf);
  return 0;
}
int listdir(const char *nf){
 DIR *pd; struct dirent *pde;
 char cale[256], specificator[256]; 
 char cale2[256];
 if((pd=opendir(nf))==NULL)return -1;
 strcpy(cale2,nf);
 strcpy(cale, nf); strcat(cale,"/");
 while((pde=readdir(pd))!=NULL){
   strcpy(specificator, cale); strcat(specificator, pde->d_name);
   if(fileinfo(specificator,cale2)==-1)perror(specificator);
 }
 return 0;
}
int main(int na, char *a[]){
  if(na==2)if(listdir(a[1])==-1)perror(a[1]);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

原因是..的结果中有.(父目录)和readdir(当前目录)。您应该阻止对这两个条目进行递归listdir()调用 此外,您需要在完成使用后调用closedir

以下是您的功能listdir的快速修复:

int listdir(const char *nf){
    DIR *pd; struct dirent *pde;
    char cale[256], specificator[256]; 
    char cale2[256];
    if((pd=opendir(nf))==NULL)return -1;
    strcpy(cale2,nf);
    strcpy(cale, nf); strcat(cale,"/");
    while((pde=readdir(pd))!=NULL){
         if (!strcmp(pde->d_name, ".") || !strcmp(pde->d_name, ".."))
             continue;
         strcpy(specificator, cale); strcat(specificator, pde->d_name);
         if(fileinfo(specificator,cale2)==-1)perror(specificator);
    }
    closedir(pd);
    return 0;
}

另外,请注意,calce/calce2/specificator中的组合路径名称不会超过256个字节,而且只有d_name中的struct dirent通常只有{{1}}。