问题
back with another segfault. Not sure why, as this readdir line is the same one i've been using in other file copy assignments. Below is the code I crafted in lieu of the assignment shared here. I have commented where the segfault occurs in hopes of aiding better minds find my flaw!
This is 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;
}
and the relevant header file;
#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
回答1:
Try checking that the value of directory
is not NULL before calling readdir
. You have this line
directory = opendir(f1);
but are not checking if the return value is NULL which could be the cause of the segfault. At the very least this will prevent a segfault in the event that you pass in an invalid command line argument for the directories.
来源:https://stackoverflow.com/questions/13148673/segfault-with-producer-consumer-file-copy