从文件读取时使用段错误,并使用pthread_create

时间:2015-11-19 18:05:50

标签: c segmentation-fault pthreads file-read

每当我运行我的代码时,我都会经历4次迭代读取文件并创建一个pthread,直到它以ID 11进行段错误。

段错由我的打印ln引起:     printf("%s%s \ n","使用包",*包调用lab_manifes_alignment); 但为什么会导致段错?

HALP?

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>

pthread_mutex_t mutex;

FILE *packageList;

void *submitPackage(void * packageReq){
    char ** package = packageReq;
    strcat(packageReq, " | sh lab_manifest_alignment.sh");
    printf("%s %s\n", "Calling lab_manifes_alignment with package", *package);
    system(packageReq);
    return NULL;
}


int main(){
    int numThreads;
    pthread_t threads[numThreads];

    //Init mutex
    if(pthread_mutex_init(&mutex, NULL)){
            fprintf(stderr, "Error initializing mutex");
    }

    int rc;
    FILE *packageList = fopen("package_list.txt", "r");
    if(packageList == NULL){
            fprintf(stderr, "ERROR: cannot open file.\n");
            return 1;
    }

    int i = 0;
    char line[128];

    while ( fgets ( line, sizeof line, packageList ) != NULL ){ 
    /* read a line spawn as many threads as needeed*/
        printf("%s %d, %s\n", "line: ",i, line);
        rc = pthread_create(&(threads[i]), NULL, submitPackage, line);

        if(rc){
            printf("ERROR: return code from pthread_create() is %d\n", rc);
            exit(EXIT_FAILURE);
        }
        i++;
    }

    numThreads = i;

    for(i = 0; i < numThreads; i++){
            pthread_join(threads[i], NULL);
    }

    fclose(packageList);
    return 0;

}

2 个答案:

答案 0 :(得分:1)

我认为问题在这里:

char ** package = packageReq;

尝试改变:

char ** package = &packageReq;

答案 1 :(得分:1)

pthread_t threads[numThreads]; numThreads在这里未初始化,您应该选择最大线程值或动态分配。

fgets ( line, sizeof line, packageList )将128个字节读入line(数组的大小),但strcat(packageReq, " | sh lab_manifest_alignment.sh");会在其后面添加一些内容。这就是你的段错误的原因。您应该增加数组的大小并减小fgets中的size参数。

主线程中的下一次迭代将覆盖您的line数组,而线程则使用它。您应该在每次迭代中使用2D数组或分配缓冲区,并在使用它后在线程中释放它。每个线程必须得到自己的缓冲区,而不是每个人都一样。

char ** package = packageReq;应为char *package = packageReq;,并移除*上的printf