2017-05-17 52 views
2

所以只是爲了澄清。這是一個學校作業。我們正在編寫一個簡化的查找程序(sfind),並且我遇到了一個問題。編寫我自己的查找程序時出現Seg錯誤

基本上,在任何情況下,-print標誌都可以在任何情況下都可以完美地工作,因爲這種情況下沒有太多的數據可以查看。但是,當我嘗試從我的基目錄(其中有大量文件)運行它時,我最終遇到了seg故障。我覺得這可能是由於許多原因。

  1. 我的用戶進程限制太低
  2. 我的最大文件大小太低
  3. 我得到堆棧溢出了太深的遞歸
  4. 我俯瞰
一些其他的事情

我在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; 
} 
+0

因爲你沒有基礎案例 –

+0

你能澄清一點嗎?因爲代碼更多。我將在 – Joe

+0

中編輯它使用調試器的時間。 – Olaf

回答

0

的開始你有一個遞歸調用每一個文件你正在處理。調用堆棧會變得很快,你會溢出堆棧。

更改代碼以遞歸到每個目錄而不是每個文件。讓函數只接受一個目錄路徑。然後打開目錄並使用while循環遍歷每個條目。如果條目是目錄,則,然後使用子目錄的名稱進行遞歸調用。

+0

嗯,所以你的意思是,最後當我打電話給自己的打印助手與它最初調用的所有相同的東西,而不是做一個while循環?我認爲這是有道理的 – Joe

+0

@Joe不只是結束。通過調用'opendir'來啓動函數,然後使用'while((entry = readdir(dir))!= NULL)'讀取條目,然後使用'closedir'結束。 – dbush

+0

是的,我現在已經明白了。非常感謝。我被嚴重的難住了。 – Joe

相關問題