如何将 regexec 与内存映射文件一起使用?

2024-02-13

我正在尝试在大内存映射文件中查找正则表达式 通过使用正则执行()功能。我发现当文件大小变大时程序崩溃 是页面大小的倍数。

有没有正则执行()具有字符串长度的函数 作为附加参数?

Or:

如何在内存映射文件中查找正则表达式?

这是总是崩溃的最小示例 (如果我运行少于 3 个线程,程序不会崩溃):

ls -la ttt.txt 
-rwx------ 1 bob bob 409600 Jun 14 18:16 ttt.txt

gcc -Wall mal.c -o mal -lpthread -g && ./mal
[1]    11364 segmentation fault (core dumped)  ./mal

程序是:

#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

#include <stdio.h>
#include <assert.h>
#include <pthread.h>
#include <regex.h>

void* f(void*arg) {
  int size = 409600;
  int fd = open("ttt.txt", O_RDONLY);
  char* text = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
  close(fd);

  fd = open("/dev/zero", O_RDONLY);
  char* end = mmap(text + size, 4096, PROT_READ, MAP_PRIVATE | MAP_FIXED, fd, 0);
  close(fd);

  assert(text+size == end);

  regex_t myre;
  regcomp(&myre, "XXXXX", REG_EXTENDED);
  regexec(&myre, text, 0, NULL, 0);
  regfree(&myre);
  return NULL;
}

int main(int argc, char* argv[]) {
  int n = 10;
  int i;
  pthread_t t[n];
  for (i = 0; i < n; ++i) {
    pthread_create(&t[n], NULL, f, NULL);
  }
  for (i = 0; i < n; ++i) {
    pthread_join(t[n], NULL);
  }
  return 0;
}

附: 这是 gdb 的输出:

gdb ./mal 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/bob/prog/c/mal...done.
(gdb) r

Starting program: /home/srdjan/prog/c/mal 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff77ff700 (LWP 11817)]
[New Thread 0x7ffff6ffe700 (LWP 11818)]
[New Thread 0x7ffff6799700 (LWP 11819)]
[New Thread 0x7fffeffff700 (LWP 11820)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff6799700 (LWP 11819)]
__strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:72
72  ../sysdeps/x86_64/multiarch/../strlen.S: No such file or directory.
(gdb) bt
#0  __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:72
#1  0x00007ffff78df254 in __regexec (preg=0x7ffff6798e80, string=0x7fffef79b000 'a' <repeats 200 times>..., nmatch=<optimized out>, 
pmatch=0x0, eflags=<optimized out>) at regexec.c:245
#2  0x00000000004008e6 in f (arg=0x0) at mal.c:24
#3  0x00007ffff7bc4e9a in start_thread (arg=0x7ffff6799700) at pthread_create.c:308
#4  0x00007ffff78f24bd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#5  0x0000000000000000 in ?? ()
(gdb) 

Celada https://stackoverflow.com/a/11038239/134633正确识别问题 - 文件数据不一定包含空终止符。

您可以通过在文件后面立即映射一个零页来解决该问题:

int fd;
char *text;

fd = open("ttt.txt", O_RDONLY);
text = mmap(NULL, 409600, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd);

fd = open("/dev/zero", O_RDONLY);
mmap(text + 409600, 4096, PROT_READ, MAP_PRIVATE | MAP_FIXED, fd, 0);
close(fd);

(请注意,您可以关闭fd紧接着mmap(), 因为mmap()添加对打开文件描述的引用)。

您当然应该在上面添加错误检查。此外,许多 UNIX 系统都支持MAP_ANONYMOUS您可以使用它来代替打开的标志/dev/zero(但这不在 POSIX 中)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 regexec 与内存映射文件一起使用? 的相关文章

  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 使用 C# 驱动程序从 mongodb 检索数据

    我在我的测试项目中使用 C 的官方 mongodb 驱动程序 并且我已经将文档从 C Web 应用程序插入到 mongodb 在 mongo 控制台中 db blog find 可以显示我插入的条目 但是当我尝试检索它们时 net 抛出异常
  • Python 中 subprocess.PIPE 的非阻塞读取

    我正在使用子流程模块 http docs python org library subprocess html启动子进程并连接到其输出流 标准输出 我希望能够在其标准输出上执行非阻塞读取 有没有办法使 readline 非阻塞或在调用之前检
  • 用于从组合框中获取所选值的 JavaScript 代码

    任何人都可以给我一个从现有组合框中获取所选值的示例代码吗 我有这段代码 但它没有做任何事情 function check var e document getElementById ticket category clone var str
  • SignalR 方法访问异常

    当我尝试调试一个简单的信号应用程序时出现此错误 尝试访问该方法 Microsoft AspNet SignalR DependencyResolverExtensions InitializePerformanceCounters Micr
  • Keras 拟合生成器 - ValueError:无法找到可以处理输入的数据适配器

    我正在尝试使用自定义生成器来适应我的深度学习模型 When i fit the model it shows me this error 我试图找到类似的问题 但所有答案都是关于将列表转换为 numpy 数组 我认为这不是这个错误的问题 我
  • 如何删除 RESTful WCF 服务中的“.svc”扩展名?

    据我所知 RESTful WCF 的 URL 中仍然包含 svc 例如 如果服务接口是这样的 OperationContract WebGet UriTemplate Value value string GetDataStr string
  • 如何使用 HTML5、JS 或 Angular 在 Ionic 中验证电子邮件?

    我注意到这是一件令人痛苦的事情 type email 的 HTML5 验证器似乎在 Ionic 视图 中不起作用 我尝试了所有可能的方法 但它不起作用 我在用 离子 视图 Angular HTML5 这是我现在的 HTML
  • 如何在android中使用javamail API发送电子邮件

    我想在 Android 应用程序中发送电子邮件而不使用电子邮件客户端 无需用户交互 我有代码 我在我的应用程序中尝试过 但是当我尝试运行时 它显示一条通知 消息已发送 但我没有收到来自我在代码中提到的特定 ID 的任何电子邮件 我也没有收到
  • 我如何使用 C# 从代码隐藏隐藏 html 列表项
  • 我想使用 C 隐藏 li 标签的 html 列表项 但我不能这样做 之前我只是使用 C 隐藏 DIV 标签 但我无法隐藏 li 标签 请帮助我做到这一点 如果可以 请发送您的详细说明 这是我的部分代码 this hide style Add
  • 使用 Spring Security 和 Java Config 的自定义身份验证提供程序

    如何使用 Spring Security 和 Java 配置来定义自定义身份验证提供程序 我想在我自己的数据库上执行登录检查凭据 以下内容满足您的需要 CustomAuthenticationProvider是您的实现 需要由 Spring
  • 将文本精确放置在 System.Label 上的图形 DrawString

    我已经覆盖了OnPaint https msdn microsoft com en us library system windows forms control onpaint aspx我的方法Label https msdn micro
  • 角色“phones_extensions”引用的类型中没有定义名称为“restriction_class_id”的属性

    我从数据库创建了一个新的实体框架模型 这个数据库有很多表 主表是phones extensions Phones extensions 表中的列与其他表是 FK 的 例如该restriction class id是链接到phones res
  • 是否自导入分包?

    假设您有以下内容 b b init py b c b c init py b c d b c d init py 在某些 python 包中 如果你import b 您只能得到 b 中定义的符号 要访问 b c 您必须明确import b
  • 如何在 ios swift 的 tableview 内添加 uilabel 的滑动手势?

    我正在尝试在表视图中创建检查列表 在表视图单选按钮和 UILabel 内 这里向 UILabel 添加滑动手势 对于 UILabel 的单次滑动将显示单选按钮或 UILabel 的两次滑动将显示虚线 我尝试使用选择器方法向表内的 UILab
  • Internet Explorer jQuery 重定向

    我目前正在研究http thetradinghouse co nz http thetradinghouse co nz我在访问购物车时遇到问题 所采取的过程是 选择类别 选择产品并打开产品页面 单击添加到购物车 产品添加到购物车 但页面重
  • 如何将“折叠”添加到 Django StackedInline

    以同样的方式 您可以将 classes collapse 添加到您的 ModelAdmin 字段集之一 我希望能够让内联模型管理可折叠 这张票 内联相关对象的管理界面中的折叠 http code djangoproject com tick
  • 矩阵中带有障碍物和作弊路径的最短路径

    首先 这是一项作业 我不是在寻找直接答案 而是在寻找您可能想到的最佳解决方案的复杂性 这是矩阵中两点 起点和终点 之间有障碍物时的最短路径的已知问题 可接受的移动方式为上 下 左 右 假设在移动时我携带某物 每次移动的成本是 2 矩阵中有一
  • 如何使用配置模式进行 find_package 搜索并在模块模式下进行回退?

    当一个库使用 CMake 定义构建并经历为自己构建安装包的麻烦时 将会出现XXXConfig cmake 如果库没有办法将其目标导出到 CMake CMake 会尝试通过提供来弥补差距FindXXX cmake尝试查找此类库的脚本 在文档中
  • 为什么在类中将变量声明为私有? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 各位 我首先要道歉 因为我确信这已经在其他地方得到了回答 我只是找不到以我理解的方式解释它的答案 我正在上一门理学硕士转换课程 有一些基本的基础知识我
  • 如何将 regexec 与内存映射文件一起使用?

    我正在尝试在大内存映射文件中查找正则表达式 通过使用正则执行 功能 我发现当文件大小变大时程序崩溃 是页面大小的倍数 有没有正则执行 具有字符串长度的函数 作为附加参数 Or 如何在内存映射文件中查找正则表达式 这是总是崩溃的最小示例 如果