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

Seg Fault when reading from file, and using pthread_create

每当我 运行 我的代码时,我都会经历 4 次读取文件和创建 pthread 的迭代,直到它出现 ID 为 11 的段错误。

段错误是由我的打印ln引起的: printf("%s %s\n", "Calling lab_manifes_alignment with package", *包); 但是为什么这会导致段错误?

停一下?

#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;

}

我认为问题出在这里:

char ** package = packageReq;

尝试改变:

char ** package = &packageReq;

pthread_t threads[numThreads];numThreads这里是未初始化的,你应该选择一个线程的最大值或者动态分配。

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

中的大小参数

主线程中的下一次迭代将覆盖您的 line 数组,同时线程使用它。您应该使用二维数组或在每次迭代中分配一个缓冲区,并在使用它后在线程中释放它。每个线程都要得到自己的buffer,每个线程不一样。

char ** package = packageReq; 应该是 char *package = packageReq; 并删除 printf.

处的 *