编写自己的查找程序时出现Seg错误

时间:2017-05-17 17:54:17

标签: c linux unix

所以只是澄清一下。这是为了学校作业。我们正在编写一个简化的查找程序(sfind),我遇到了一个问题。

基本上,-print标志可以在任何不需要查看的情况下完美运行。但是,当我尝试从我的基本目录(具有大量文件)运行它时,我最终遇到了seg错误。我觉得这可能有很多原因。

  1. 我的用户流程限制太低
  2. 我的最大文件太小
  3. 我的堆栈溢出过于递归
  4. 我忽视的其他一些事情
  5. 我在ubuntu上运行它,它将在Unix服务器上运行。

    这是我当前的递归代码。

    int printHelper(struct dirent *entry, DIR *dir, char* path){
        struct stat fileStat;
        DIR *tempDir;
        char tempPath[1000];
        char const* name = entry->d_name;
        strcpy(tempPath, path);
        strcat(tempPath, name);
        lstat(tempPath, &fileStat);
        if(strcmp(name, ".") != 0 && strcmp(name, "..") != 0){
            printf("%s%s\n", path, name);
        }
        if((S_ISDIR(fileStat.st_mode)) && (strcmp(name, ".") != 0) && (strcmp(name, "..") != 0)){
            struct dirent *tempEntr;
            char newTempPath[1000];
            char newPathName[1000];
            strcpy(newPathName, name);
            strcpy(newTempPath, path);
            strcat(newTempPath, newPathName);
            strcat(newTempPath, slashPath);
            tempDir = opendir(newTempPath);
            tempEntr = readdir(tempDir);
            printHelper(tempEntr, tempDir, newTempPath);
            closedir(tempDir);
        }
        if(!(entry = readdir(dir))){
                return 0;
        }
        printHelper(entry, dir, path);
        return 0;
    }
    

    这是文件的开头

    #include <sys/stat.h>
    #include <sys/resource.h>
    #include <sys/time.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <stdio.h>
    #include <string.h>
    #include "myPrint.h"
    
    char slashPath[3] = "/\0";
    
    int myPrint(char const* myFile){
        DIR *dir;
        struct dirent *entry;
    
        int isDir;
        isDir = 1;
    
        if (!(dir = opendir(myFile))){
            isDir = 0;
        }
        else if (!(entry = readdir(dir))){
            return -1;
        }
        if(isDir == 0){
            dir = opendir(".");
            while((entry = readdir(dir))){
                if(strcmp(myFile, entry->d_name) == 0){
                    printf("%s\n", myFile);
                    return 0;
                }
            }
            printf("find: ‘%s’: No such file or directory\n", myFile);
            return 0;
        }
        else{
            char path[2000];
            strcpy(path, myFile);
            strcat(path, slashPath);
            printf("%s\n", myFile);
            printHelper(entry, dir, path);
            return 0;
        }
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

您对正在处理的每个文件进行递归调用。调用堆栈将快速深入,您将溢出堆栈。

更改代码以递归每个目录而不是每个文件。让函数只接受目录路径。然后打开目录并使用pip install <downloaded scikit-learn whl file>循环遍历每个条目。如果条目是目录,则然后使用子目录的名称进行递归调用。