Я пытаюсь отсортировать некоторые записи по их ключам в C.
Существует M записей, и синтаксис каждой записи:
KEY v -------- DATA v
1234abcd. abcdefghijklmnopqrstuvwxyzzzzzzzzzz
Каждая запись имеет 8-байтовое шестнадцатеричное значение ключа, за которым следуют 64 байта данных.
Процесс выглядит следующим образом:
- открыть файл
- создать карту памяти файла
- теперь в памяти с гигантским символом * создайте N потоков
- использовать N потоков для сортировки M/N записей
- объединить соседние отсортированные разделы, т.е. 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
. Позвонитеperror
доclose
. - person Some programmer dude   schedule 14.04.2015