从文件读取并使用 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
.
处的 *
每当我 运行 我的代码时,我都会经历 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
.
*