0

回到另一段错误。不知道为什么,因为这readdir线是我一直在使用其他文件副本分配相同的。以下是我制作的代码,代替共享here的作业。我已经评论了段错误发生的位置,希望能帮助更好的人发现我的缺陷!带有生产者/消费者文件复制的SegFault

这是copyDirs.cpp

//cmd: ./a.out [#ofConsumerThreads] [src directory] [dest directory] 

#include "copyDirs.h" 

int main(int ac,char* av[]) 
{ 
pthread_mutex_init(&buflock,NULL); 
pthread_t prodT; 

if(ac == 4) 
{ 
    int consNum = atoi(av[1]); 

    pthread_t thread[consNum]; 

    strcpy(f1,av[2]); 
    strcpy(f2,av[3]); 

    directory = opendir(f1); 
    pthread_create(&prodT,NULL,producer,NULL); //segfault happens in producer function 

     pthread_join(prodT, NULL); 

    for(int i=0;i<consNum && buffer.size() > 0;i++) 
    { 
     pthread_create(&thread[i],NULL,consumer,NULL); 
      pthread_join(thread[i],NULL); 
    } 

    closedir(directory); 
} 
else cout<<"Try that again ;)"<<endl; 

pthread_mutex_destroy(&buflock); 
pthread_exit(NULL); 

return 0; 
} 

和相关的头文件;

#ifndef COPYDIRS_H 
#define COPYDIRS_H 

#include <iostream> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <string.h> 
#include <dirent.h> 
#include <pthread.h> 
#include <time.h> 
#include <stack> 

using namespace std; 

struct FD 
{ 
public: 
char* i ; 
char* o; 

FD(){} 

FD(char* input, char* output) 
{ 
    i=input; 
    o=output; 
} 
}; 

char f1[PATH_MAX]; 
char f2[PATH_MAX]; 

struct dirent *curDir; 
DIR* directory = NULL; 

pthread_mutex_t buflock; 
stack <FD> buffer; 

void* producer(void*) 
{ 
cout<<"SegTest"<<endl; 
    //shows 

while (curDir = readdir(directory)) //segfault on this line 
{ 
    cout<<"SegTest"<<endl; 
     //doesn't show 

    char* file = curDir -> d_name; 
    char* i = new char[256]; 
    char* o = new char[256]; 

    strcpy(i,f1); 
    strcpy(o,f2); 
    strcat(i,file); 
    strcat(o,file); 
    FD prodFD(i,o); 

    cout<<"Pushing "<<file<<" to buffer!"<<endl; 
    pthread_mutex_lock(&buflock); 
     buffer.push(prodFD); 
    pthread_mutex_unlock(&buflock); 

    i = NULL; 
    o = NULL; 
} 

pthread_exit(NULL); 
} 

void* consumer(void*) 
{ 
FD consFD; 
char c; 

consFD = buffer.top(); 
buffer.pop(); 
    //ERROR: "statement cannot resolve address of overloaded function 

cout << "Copying file: "<<consFD.i<<endl; 
pthread_mutex_lock(&buflock); 
    FILE * consIF = fopen(consFD.i,"r"); 
    FILE * consOF = fopen(consFD.o,"w"); 
pthread_mutex_unlock(&buflock); 

pthread_exit(NULL); 
} 
#endif 
+0

重构。重构吧! .h文件中的方法?万亿全球?将i&o(有用的名称)设置为NULL而不是删除?如果你的代码是可读的,你会发现它更容易调试! – John3136

+0

@ John3136,我知道我使用的头文件不是传统的,但是在小的作业中,我发现以这种方式组织起来要容易得多。 我还有一些其他的事情可以改善代码:尴尬: –

回答

0

尝试检查的directory值不调用readdir前NULL。你有这条线

directory = opendir(f1); 

但是不检查返回值是否为NULL,这可能是段错误的原因。至少这会防止在您传入目录的无效命令行参数的情况下发生段错误。

+0

似乎已经解决了它!谢谢!你们都很棒! –