SegFault avec copie de fichier producteur / consommateur

retour avec un autre segfault. Vous ne savez pas pourquoi, car cette ligne readdir est identique à celle que j’ai utilisée dans d’autres affectations de copie de fichier. Vous trouverez ci-dessous le code que j’ai créé à la place de la tâche partagée ici . J’ai commenté où la segfault se produit dans l’espoir d’aider de meilleurs esprits à trouver mon défaut!

C’est 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 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; } 

et le fichier d’en-tête correspondant;

 #ifndef COPYDIRS_H #define COPYDIRS_H #include  #include  #include  #include  #include  #include  #include  #include  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  buffer; void* producer(void*) { cout<<"SegTest"<<endl; //shows while (curDir = readdir(directory)) //segfault on this line { cout<<"SegTest"< 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 

Essayez de vérifier que la valeur de directory n’est pas NULL avant d’appeler readdir . Vous avez cette ligne

  directory = opendir(f1); 

mais ne vérifie pas si la valeur de retour est NULL, ce qui pourrait être la cause du segfault. À tout le moins, cela évitera un segfault si vous transmettez un argument de ligne de commande non valide pour les répertoires.