- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在一个大的内存映射文件中找到一个正则表达式通过使用 regexec() 函数。我发现程序崩溃时文件大小是页面大小的倍数。
是否有一个regexec() 函数,它具有字符串的长度作为附加参数?
或者:
如何在内存映射文件中查找正则表达式?
这是总是崩溃的最小示例(如果我运行少于 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正确识别问题 - 文件数据不一定包含空终止符。
您可以通过在文件后立即映射一页零来解决此问题:
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);
(注意可以在mmap()
之后立即关闭fd
,因为mmap()
添加了对打开文件描述的引用).
您当然应该在上面添加错误检查。此外,许多 UNIX 系统支持 MAP_ANONYMOUS
标志,您可以使用它来代替打开 /dev/zero
(但这不在 POSIX 中)。
关于c - 如何将 regexec 与内存映射文件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11037521/
给定一个具有以下结构的二进制文件 unsigned int number1; unsigned int num_rec; acct_info_t acct[num_rec]; acct_info_t
这是我第一次真正尝试使用 C 和正则表达式,所以请耐心等待...我有一个模式数组 (shortener_patterns),其中我将其连同要编译的计数和数组一起传递给 compile_patterns
我遇到了一个问题,其中我的 regexec 代码返回的结果与 Java 代码不同。我使用了相同的正则表达式,但在 c++/c 中返回不同。 这是我的代码片段: const char *pattern
我正在尝试使用以下正则表达式匹配“sdb-iof-pool 1008.56M 884K”等字符串:^(.*)([\s]+)([-+]?[0-9 ]*\.?[0-9]+)([K|M|G|T|P]{1})
我正在实现一个“银行”软件,在创建新用户时必须采用可接受的用户名、密码和余额。 BANK: create-user bob 1234 11111 这是正确输入的示例 BANK: create-user
我需要检查月份是否为 01-12 的形式。我制作了一个正则表达式并输入以检查它是否与正则表达式匹配。代码- #include #include using namespace std; #inclu
我试图在一个大的内存映射文件中找到一个正则表达式通过使用 regexec() 函数。我发现程序崩溃时文件大小是页面大小的倍数。 是否有一个regexec() 函数,它具有字符串的长度作为附加参数? 或
我试图在一个大的内存映射文件中找到一个正则表达式通过使用 regexec() 函数。我发现程序崩溃时文件大小是页面大小的倍数。 是否有一个regexec() 函数,它具有字符串的长度作为附加参数? 或
在以下过于简化的代码示例中: reg = "^[0-9]{1,10}$"; str = "123abc"; regcomp(&re, reg, REG_EXTENDED); regexec(&re,
我有一个像 051916.000 这样的输入字符串。我想隔离 05、19、16 和 000。我正在尝试以这种方式在 C 语言中使用 regexec。 regex_t r; regmatch_t pma
我有一个模式 "^\+?\d{3,20}$" 对“123455”、“+123445”进行测试,预期匹配。 测试“123+213”、“abc”,预计不会匹配。 此模式适用于 pcre_exec(),但不
我正在尝试创建一个正则表达式来评估以下划线开头的数字序列,如下所示:_201312我对数字部分有疑问;我总是收到 REG_NOMATCH 消息。这是代码: #include int result_e
谁能告诉我使用哪个库来利用 regexec()、regfree() 和 regcomp() 函数?我知道它们是在 regex.h 头文件中定义的,但即使在包含头文件之后,当我尝试在 HP-UX 中编译
正则表达式模式需要匹配以下内容: abc_xyz_0 abc_1025_01.29.00_xyz_0 abc_0302_42.01.00_xyz_0 (abc 和 xyz 之间的数字无关紧要) 所以我
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression
有没有办法拿到libc6的正则表达式函数 regcomp和 regexec使用多字节字符正常工作? 例如,如果我的模式是 utf8 字符 猫机+猫 , 在 utf8 编码字符串上找到匹配项 猫机机机猫
这个问题已经有答案了: Why is the following regex not working in C using regcomp (2 个回答) 已关闭 3 年前。 这是我的代码: #inc
我有以下脚本,它解析进程内存以查找字符串匹配,一切正常,但转储编辑器(在本例中为纳米)的进程与 1193 可能的匹配(如果我转储内存,然后对其执行egrep),但我的代码仅输出 3 匹配项。有什么想法
我正在尝试检查字符串是否为有效数字。有效数字类似于 123 或 123.456。我尝试使用 [0-9]+(\\.[0-9]+)? 进行匹配,但这不起作用。 这是我目前所拥有的。 #include #
我有这个代码: char *buffer = calloc(400, sizeof(char)); // buffer gets assigned a string through fgets if
我是一名优秀的程序员,十分优秀!