每当我运行我的代码时,我都会经历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;
}
答案 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
。