2014-03-25 75 views
-5

在我的程序中,我提供了一個包含文本文件的目錄。每一個文本文件包含幾百行的格式如下pthread segfault在哪裏發生?

Username,Password,BloodType,Domain,Number 

然後我創建在其中將合併排序(按編號)目錄中的每個文件中的線程這些行到陣列中的char * text_lines [ 6000];

我不明白爲什麼我得到一個分段錯誤,因爲我在每次運行時都會得到不同的輸出。

繼承人我的代碼:

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <pthread.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <string.h> 

void store_line(char* line); 
void* my_merge_sort(void* file); 

char** text_lines; 

int main(int argc, char* argv[]) 
{ 

    if(argc != 2) 
    { 
     fprintf(stderr, "usage: ./coolsort <directory>\n"); 
    } 
    else 
    { 
     text_lines = malloc(6000 * sizeof(char*)); 
     DIR* the_directory; 
     int filecount = 0; 
     struct dirent* directory_files[50]; 
     if((the_directory = opendir(argv[1])) != NULL) 
     { 
      //make a list of the files in the directory 
      while((directory_files[filecount++] = readdir(the_directory))) ; 
      filecount--; 

      //<<<DEBUGGING INFO> 
      int i; 
      fprintf(stderr,"there are %i files in %s:\n", filecount, argv[1]); 
      for(i = 0; i < filecount; i++) 
      { 
       fprintf(stderr, "%s\n",directory_files[i]->d_name); 
      } 
      char cwd[512]; 
      chdir(argv[1]); 
      getcwd(cwd, sizeof(cwd)); 
      fprintf(stderr, "the CWD is: %s\n", cwd); 
      //<DEBUGGING INFO>>> 

      //lets start some threads 
      pthread_t threads[filecount-2]; 
      int x = 0; 
      for(i = 0; i < (filecount); i++) 
      { 
       if (!strcmp (directory_files[i]->d_name, ".")) 
        continue; 
       if (!strcmp (directory_files[i]->d_name, ".."))  
        continue; 
       pthread_create(&threads[x++], NULL, my_merge_sort, (void*)directory_files[i]->d_name); 
      } 
      //do stuff here 

      // 
     } 
     else 
     { 
      fprintf(stderr, "Failed to open directory: %s\n", argv[1]); 
     } 
    } 
} 

void* my_merge_sort(void* file) 
{ 
    fprintf(stderr, "We got into the function!\n"); 
    FILE* fp = fopen(file, "r"); 
    char* buffer; 
    char* line; 
    char delim[2] = "\n"; 
    int numbytes; 

    //minimize I/O's by reading the entire file into memory; 
    fseek(fp, 0L, SEEK_END); 
    numbytes = ftell(fp); 
    fseek(fp, 0L, SEEK_SET); 
    buffer = (char*)calloc(numbytes, sizeof(char)); 
    fread(buffer, sizeof(char), numbytes, fp); 
    fclose(fp); 

    //now read the buffer by '\n' delimiters 
    line = strtok(buffer, delim); 
    fprintf(stderr, "Heres the while loop\n"); 
    while(line != NULL) 
    { 
     store_line(line); 
     line = strtok(buffer, NULL); 
    } 
    free(buffer); 
} 

void store_line(char* line) 
{ 
    //extract the ID.no, which is the fifth comma-seperated-token. 
    char delim[] = ","; 
    char* buff; 
    int id; 
    int i; 
    strtok(line, delim); 
    for(i = 0; i < 3; i++) 
    { 
     strtok(line, NULL); 
    } 
    buff = strtok(line, NULL); 
    id = atoi(buff); 

    //copy the line to text_lines[id] 
    memcpy(text_lines[id], line, strlen(line)); 
} 

編輯:我檢查,以確保它會融入初始陣列,發現最高的ID是唯一的3000;

回答

1
  1. 您使用的strtok()是錯誤的:

    line = strtok(buffer, NULL); 
    

    應該

    line = strtok(NULL, delim); 
    

    另一個錯誤,應同樣固定。

  2. text_lines的元素是未初始化:

    text_lines = malloc(6000 * sizeof(char*)); 
    

    這種分配6000個指針char,但這些指針被初始化。