【问题标题】:Parsing memory mapped file C解析内存映射文件C
【发布时间】:2015-11-23 02:01:23
【问题描述】:

我目前正在构建一个功能性的 DNS 服务器,我需要一些帮助来完成它。目前我打开服务器并使用 dig 命令发送我的请求。问题是如何正确回答它们。在我在内存中映射一个包含域名及其 IP 的文件(使用 mmap)之前,所以如果我收到任何关于本地地址的请求,我可以通过使用获取请求的线程解析 mmaped 文件来回答它从链表中提取所需的信息。我似乎无法找到正确的方法。

我将在下面留下我的 mmap 代码:

void mmap_localdns(){
    int ldns;
    char *data;
    struct stat size;
    ldns=open("localdns.txt", O_RDONLY);
    stat("localdns.txt", &size);
    data = mmap((caddr_t)0, size.st_size, PROT_READ, MAP_SHARED, ldns, 0);
    close(ldns);
    printf("%s", data);

    char *pch;
    pch = strtok(&data, " ");

    while(pch != NULL){
        printf("%s\n", pch);
        pch = strtok(NULL, " ");
    }
    //munmap(data, size.st_size);
}

尝试使用 strtok() 但它一直给我一个分段错误。也许这不是最好的解决方案:/

我所说的文件遵循以下规则:

mywebserver.so.local 192.168.1.20
fileserver.so.local 192.168.1.10
ww5.so.local 192.168.1.5

谢谢:)

【问题讨论】:

  • 您真的要为每个请求解析文件吗?听起来开销很大。我认为您应该解析文件一次,将数据放入哈希表中,然后使用该数据结构。另外,你的问题是什么?
  • strtok 修改了正在搜索的字符串,但文件已映射PROT_READ,这可能是 seg 错误的原因。对于这样的应用程序,恕我直言,使用mmap 并没有太大优势。最好使用fgets。同样正如前面评论中已经提到的,连续解析效率不高。只需解析文件一次(或每当它更改时)并每次使用该结果。
  • 好吧。然后您应该以可写模式打开文件并进行映射以使其可写。此外,您可能希望使用 MAP_PRIVATE 而不是 MAP_SHARED,因为您不太可能希望 strtok 处理更改基础文件。
  • 关于单次解析 - 只需创建一个存储解析结果的数据结构,解析一次,然后参考数据结构,而不是每次都重新解析文件。
  • strtok 碰巧修改了给它的 char 指针地址,如果您不小心恢复 char 指针地址以用于其他目的,这可能会导致段错误。例如,设置另一个 char 等于“data”地址,然后在处理“data”变量上的 strtok 后,将“data”指针地址设置回新 char 指针的地址

标签: c mmap strtok


【解决方案1】:

您正在使用O_RDONLY 标志打开文件,并使用PROT_READ 映射它 - 这一切都很好。 但是,请注意 strtok() 函数将修改其参数。 换句话说,你违背了永远不会写入 mmap 返回给你的内存位置的承诺。

解决方案是使用任何真正只读的内存例程。

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多