【发布时间】:2015-04-13 23:56:55
【问题描述】:
我正在尝试按 C 中的键对一些记录进行排序。
有M条记录,每条记录的语法为:
KEY v -------- DATA v
1234abcd。 abcdefghijklmnopqrstuvwxyzzzzzzzzzz
每条记录都有一个 8 字节的十六进制键值,后跟 64 字节的数据
流程如下:
- 打开一个文件
- 创建文件的内存映射
- 现在在内存中使用巨大的 char *,创建 N 个线程
- 使用 N 个线程对 M/N 个记录进行 qsort
- 合并相邻的排序分区,即。 0 和 1、2 和 3
现在我正在尝试定位 qsort 函数中的键,但我遇到了分段错误。
成功打开文件后我的代码。
if((fstat(fileNum, &sb)) == -1) {
printf("fstat fail");
exit(-1);
}
int sb_size = sb.st_size;
int num_records = sb_size/REC_SIZE;
printf("SB SIZE: %d\n", sb_size);
printf("num_records: %d\n", num_records);
addr = (char *)mmap(NULL, sb_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileNum, 0);
if (addr == MAP_FAILED) {
close(fileNum);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
int num_records_per_thread = num_records/num_threads;
printf("Number of Records per Thread = %d\n", num_records_per_thread);
qsort(addr, num_records_per_thread, REC_SIZE, compare);
int compare(const void *a, const void *b) {
struct mRecord rec1, rec2;
char *keya;
strncpy(keya, (char *)a, 8);
printf("in Compare: first 8 bytes are: %s", keya);
return 1;
}
这给了我一个分段错误。我怎样才能只定位键并对它们进行排序? 非常感谢。
【问题讨论】:
-
与您的问题和问题无关,但是在检查
errno时,请在失败的函数调用后立即执行此操作,最重要的是不要调用另一个可能会在两者之间改变errno的函数。我之所以提到这一点,是因为如果mmap失败,您调用close,这可能也 失败并因此改变errno值。在close之前致电perror。
标签: c multithreading pthreads mmap qsort