为什么fscanf在多线程读取期间失败?
我不熟悉pthreads。我正在运行一个线程,该线程对排序文件中的一组随机键进行二进制搜索,并读取该键的值:为什么fscanf在多线程读取期间失败?,c,multithreading,gdb,valgrind,C,Multithreading,Gdb,Valgrind,我不熟悉pthreads。我正在运行一个线程,该线程对排序文件中的一组随机键进行二进制搜索,并读取该键的值: int binary_search_in_disk(int k_level, int key){ if (!file_exist(level_fname)){ return -1; } char *line = NULL; size_t len = 0; ssize_t read; int num, file_charsize, low_key, m
int binary_search_in_disk(int k_level, int key){
if (!file_exist(level_fname)){
return -1;
}
char *line = NULL;
size_t len = 0;
ssize_t read;
int num, file_charsize, low_key, mid_key, high_key, value, op;
// file position measured in long int bytes (4), point to the first char of the
// line
int low, mid, high;
FILE* level_file = fopen(level_fname, "r");
printf("fname: %s ,", level_fname);
// find low key
low = 0;
printf("file exists? %d ,", file_exist(level_fname)); // return 1, file exists
num = fscanf(level_file, "%d%d%d\n", &low_key, &value, &op); // seg fault, file does not exist
...
}
我有另一个线程从同一个文件中读取键值对,然后销毁该文件并在其位置重命名另一个文件。我在read和destroy函数中添加了printf
,printf显示两个线程都在读取时发生seg故障。GDB还显示,在seg故障发生时,两个线程都在读取文件。当我运行程序时,seg故障发生在不同的读取值。是什么导致level_文件
突然变为空
GDB:
发现问题:
打开的文件太多
此:
FILE* level_file = fopen(level_fname, "r");
printf("fname: %s ,", level_fname);
printf("file exists? %d ,", file_exist(level_fname));
不是处理错误的正确方法:文件可能存在,但不可读,或者在调用fopen
时它可能现在存在但不存在,或者您可能内存不足,或者文件描述符不足,或者
你应该做的是:
FILE *level_file = fopen(level_fname, "r");
if (level_file == NULL) {
fprintf(stderr, "Unable to open '%s' for reading: %s\n", level_fname, sterror(errno));
return -1;
}
如果你那样做的话,错误是显而易见的
FILE* level_file = fopen(level_fname, "r");
printf("fname: %s ,", level_fname);
printf("file exists? %d ,", file_exist(level_fname));
FILE *level_file = fopen(level_fname, "r");
if (level_file == NULL) {
fprintf(stderr, "Unable to open '%s' for reading: %s\n", level_fname, sterror(errno));
return -1;
}