多线程C qsort字符数组

时间:2015-04-13 23:56:56

标签: c multithreading pthreads mmap qsort

我正在尝试按C键中的某些记录进行排序。

M 记录数量,每条记录的语法为:

KEY v -------- DATA v

1234ABCD。 abcdefghijklmnopqrstuvwxyzzzzzzzzzz

每条记录都有一个8字节的十六进制密钥值,后跟64字节的数据

流程如下:

  • 打开文件
  • 创建文件的内存映射
  • 现在在内存中使用巨型char *,创建N个线程
  • 使用 N 主题获取qsort 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;
    }

这给了我一个分段错误。我怎样才能定位键并对它们进行排序? 非常感谢你。

1 个答案:

答案 0 :(得分:1)

1)你不能使用strncpy复制keya上的变量a,因为keya是一个未初始化的指针!

2)函数compare必须返回一个比较值!

然后在函数比较中你可以写:

return strncmp( (char *)a, (char *)b, 8 ); //8 is the key length!