带有生产者/消费者文件副本的segfault

SegFault with Producer/Consumer File Copy

本文关键字:副本 segfault 文件 消费者 生产者      更新时间:2023-10-16

与另一个segfault返回。不知道为什么,因为此readdir系列与我在其他文件复制分配中使用的线路相同。以下是我制作的代码代替此处共享的作业。我已经评论了Segfault发生在哪里,希望能帮助您找到我的缺点!

这是CopleDirs.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 

尝试检查directory的值是否在调用readdir之前不是null。你有这条线

 directory = opendir(f1);

,但没有检查返回值是否为null,这可能是segfault的原因。至少,如果您在目录中通过无效的命令行参数,这将阻止segfault。