在chdir之后的readdir中的C Segfault

时间:2015-06-04 22:40:54

标签: c fopen readdir chdir

我对这个C程序有一个奇怪的问题我正在编写循环遍历目录并打开每个文件来做一些工作。我的程序位于我正在搜索的目录的父目录中。为了让fopen能够看到该目录中的文件,我正在我的while((dp = readdir(dfd))!= NULL)调用之前进行chdir(路径)调用。第一个文件被正确接收,但我在此次调用的下一次迭代中得到了一个段错误。这似乎是chdir和readdir逻辑的一个问题,我不知道如何解决它。有任何想法吗?这是我的代码:

if((dfd = opendir(dir)) == NULL){
    fprintf(stderr, "Can't open %s\n", dir);
    return 0;
}
chdir(dir);

char *filename;
//loop through the directory
while((dp = readdir(dfd)) != NULL){
    printf("Searching file %s\n", dp->d_name);
    filename = malloc(50);
    filename = dp->d_name;
    char text[80];
    int words = 0;
    int cellular = 0, CDMA = 0, GSM = 0, LTE = 0, wireless = 0, realtime = 0, GPS = 0, remote = 0, monitor = 0;
    struct stat stbuf;

    //Skip any directories
    if((stbuf.st_mode & S_IFMT) == S_IFDIR){
      printf("Directory skipped.\n");
      continue;
    }

    //Skip files that can't be opened
    if((fpt=fopen(filename,"r")) == NULL){
      printf("Couldn't open file %s.\n", filename);
      continue;
    }

    //search the file
    while(fscanf(fpt, "%s", text) != EOF){
      words++;
      //....etc

1 个答案:

答案 0 :(得分:2)

您最有可能破坏内存,导致readdir()的后续调用失败,因为dfd结构中的数据被破坏。你做了一些"坏"代码中的内容:

  • filename=malloc()后跟filename=... - 这导致内存泄漏(但不是段错误)
  • fscanf(fpt,...) - 你在堆栈上分配了80个字节,但是你要求libc读取" word"。如果单词超过80个字符,您将破坏堆栈中的任何内容。这很可能导致段错误。你可能还有其他代码,我们没有看到那些做得那么糟糕的事情。