我有一个文本文件foobar.txt,大约10KB,不是很长.然而,在高性能Linux机器上,以下匹配搜索命令大约需要10秒钟.
bash>shopt -s extglob
bash>[[ `cat foobar.txt` == ?(*[[:print:]])foobar ]]
Run Code Online (Sandbox Code Playgroud)
没有匹配:foobar.txt中的所有字符都是可打印的,但没有字符串"foobar".
搜索应该尝试匹配两个选项,每个选项都不匹配:
"foobar"
Run Code Online (Sandbox Code Playgroud)
这是不稳定的
*[[:print:]]foobar
Run Code Online (Sandbox Code Playgroud)
- 应该是这样的:
应该在一次通过中逐字符扫描文件,每次检查下一个字符是否都是
[[:print:]]foobar
Run Code Online (Sandbox Code Playgroud)
这应该也很快,每个角色都不应该花费毫秒.
事实上,如果我放弃?,就是这样做
bash>[[ `cat foobar.txt` == *[[:print:]]foobar ]]
Run Code Online (Sandbox Code Playgroud)
这是瞬间的.但这只是上面的第二种选择,没有第一种选择.
那么为什么这么久?
我可以在Python中使用"静态"变量的匿名函数吗?
例如
lambda x: re.compile(r'foobar').match(x)
Run Code Online (Sandbox Code Playgroud)
是不是很好,因为它可能会在每次调用时重新编译(如果re用完了缓存 - 感谢响应者指出缓存机制).
我可以这样做而无需重新编译:
def f(line):
try:
f.c
except:
f.c = re.compile(r'foobar')
return f.c.match(line)
Run Code Online (Sandbox Code Playgroud)
怎么用lambda做,不重新编译?
好吧,我不想使用辅助函数,在lambda中使用.使用lambdas的全部意义是"匿名".所以是的,lambda是匿名的,并且是独立的.
那种a和b我一样的预期,为什么会c有所不同呢?有没有办法使它与一致,a并且b不将所有内容转换为列表或元组?
>>> a = [(1, 0), (0, 0)]
>>> a.sort()
>>> print a
[(0, 0), (1, 0)]
>>>
>>> b = [[1], (0)]
>>> b.sort()
>>> print b
[0, [1]]
>>>
>>> c = [[1, 0], (0, 0)]
>>> c.sort()
>>> print c
[[1, 0], (0, 0)]
>>>
Run Code Online (Sandbox Code Playgroud) AC源代码(编译并运行Linux Centos 6.3)有以下行:
execve(cmd, argv, envp);
Run Code Online (Sandbox Code Playgroud)
execve不返回,但我想修改代码以知道它何时完成。所以我这样做:
if (child = fork()) {
waitpid(child, NULL, 0);
/*now I know execve is finished*/
exit(0);
}
execve(cmd, argv, envp);
Run Code Online (Sandbox Code Playgroud)
当我这样做时,生成的程序在 99% 的情况下都能正常工作,但很少会出现奇怪的错误。
以上有什么问题吗??我希望上面的代码能够像以前一样精确运行(除了慢一点)。我对么?
如果你想了解背景,修改后的代码是dash。该execve调用用于在dash找出要运行的字符串后运行一个简单的命令。当我按照上面的方式进行精确修改(等待后甚至没有运行任何东西)并在修改后的破折号下重新编译和运行程序时,大多数时候它们运行良好。然而,重新编译一个名为“biosutility”的特定内核模块给了我这个错误
cc1: error: unrecognized command line option "-mfentry"
Run Code Online (Sandbox Code Playgroud) 我知道Linux文件系统将文件名存储为字节序列,这意味着与Unicode编码无关.
但是,除了UTF-8或增强型UTF-8之外的编码很可能使用0字节作为可以出现在文件名中的Unicode字符的多字节表示的一部分.在Linux文件系统C代码中的任何地方都可以使用0字节终止字符串.那么Linux文件系统如何支持Unicode呢?是否假设所有创建文件名的应用程序仅使用UTF-8?但事实并非如此,是吗?
类似地,shell(例如bash)*在模式中使用以匹配任意数量的文件名字符.我可以在shell C代码中看到它只是使用ASCII字节*并逐字节地去分配匹配.适用于UTF-8编码的名称,因为它具有以下属性:如果您接受字符串的字节表示,然后匹配起始的一些字节*,并将其余字符与另一个字符串匹配,那么开头的字节实际上匹配一串完整的字符,而不仅仅是字节.
但其他编码没有那个属性,是吗?那么,shell再次假设为UTF-8吗?
根据当前的C标准,指针之间的差异有类型ptrdiff_t.同时,根据标准,数组的下标可以是任何整数类型,并且当前是最大的有符号整数类型long long.
如果ptrdiff_t不是long long,但更小,那么上述两个陈述将是矛盾的,不是吗?
那么为什么标准会引入类型ptrdiff_t而不只是long long用作指针差异?
为什么这个炸弹
perl -e 'print qr{$_(??{$_})}'
Run Code Online (Sandbox Code Playgroud)
虽然这两个工作分开:
perl -e 'print qr{$_}'
perl -e 'print qr{(??{$_})}'
Run Code Online (Sandbox Code Playgroud)
错误消息是
Eval-group not allowed at runtime, use re 'eval' in regex m/(??{$_})/ at -e line 1.
Run Code Online (Sandbox Code Playgroud)
真的,我应该升级Perl吗?我有5.14.4.
我试图拦截所有动态加载的函数,这些函数使用openat库comm.so使用LD_PRELOAD机制调用系统调用。
考虑以下/sbin/depmod命令的使用:
#strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64
Run Code Online (Sandbox Code Playgroud)
(...)
openat(AT_FDCWD, "/lib/modules/3.10.0-693.17.1.el7.x86_64", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
Run Code Online (Sandbox Code Playgroud)
我想拦截调用此系统调用的函数openat。
如何找出该功能是什么? openat,这可能是一个别名,以及任何其他类似的函数,都不起作用 - 没有任何内容被拦截。
我尝试使用此命令来查找我的命令正在使用哪些动态加载的函数:
#readelf -p .dynstr /sbin/depmod
Run Code Online (Sandbox Code Playgroud)
这会打印出一些.so库,所以我readelf递归地使用它们。在递归结束时,我得到了以下包含open和 的函数列表at:
openat
openat64
open_by_handle_at
__openat64_2
Run Code Online (Sandbox Code Playgroud)
这些都不起作用 - 它们不会拦截返回文件描述符 3 的调用。
好的,那么如何找出我还需要拦截哪些其他函数呢?我是否必须一一递归地遍历命令显示的所有函数readelf(有很多)?
如果我在Linux中运行一些命令行应用程序,如何判断该进程访问(读取和/或写入)哪些文件?我想我需要在文件系统驱动程序中放置一些钩子并重新编译内核,或类似的东西?有没有更简单的方法?
我之前有一个关于 bash 的问题eval,响应者向我确认我必须eval在这种情况下使用。
手册上eval说 - 这就是它所说的我害怕 -
评估 [参数]
参数连接在一起形成一个命令,然后读取和执行该命令,其退出状态作为 eval 的退出状态返回。如果没有参数或只有空参数,则返回状态为零。
现在我有这个问题:
bash> printf '\n'
bash> eval printf '\n'
nbash>
Run Code Online (Sandbox Code Playgroud)
这是为什么?为什么 eval (我必须使用,不是在 SSCCE 的情况下,而是在实际情况下)会破坏 printf 的效果?
我希望手册能更多地说明 bash 和 eval 的行为方式。以前的响应者在哪里找到所有这些信息,似乎比手册上说的要多(如我上面所示)。
好的,响应者建议引用。太好了,但现在我真的需要这个
bash> printf "foo bar"'\n'
Run Code Online (Sandbox Code Playgroud)
与 eval 一起工作。如果我做
bash eval "printf foo bar'\n'"
Run Code Online (Sandbox Code Playgroud)
不像以前那样工作
>perl -e '$_ = q(t b[\)sizeof];); s/(t?(\w)(?:\s(\w))?\s(\w)(\[([^\]]+)\]))/eval $1/e'
Bareword found where operator expected at (eval 1) line 1, near ")sizeof"
(Missing operator before sizeof?)
Run Code Online (Sandbox Code Playgroud)
这是合法的Perl,那么为什么会出现错误信息?我有最新的Perl.
这是一个SSCCE; 减少任何一个字符,并且不显示错误消息.
我以为我认识C和互斥体......显然我没有.
下面的代码,我希望打印地址,等待5秒,然后再次打印相同的地址.
它没有 - 它打印两次相同的地址,但立即,为什么?
我编译代码
>gcc -lpthread foobar.c
Run Code Online (Sandbox Code Playgroud)
我一定不明白一些明显的东西,这是令人尴尬的......
根据Jonathan Leffler和Chris Dodd以及user3629249的建议,我编写了如下代码,同样的问题.这变得非常尴尬......
foobar.c但是:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
void foobar(pthread_mutex_t *plock) {
pthread_mutex_lock(plock);
printf("lock address %p\n", plock);
fflush(stdout);
sleep(5);
pthread_mutex_unlock(plock);
}
int main(void)
{
pthread_mutex_t *plock;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
printf("return %d\n", pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED));
printf("mutex allocated %p\n", plock = malloc(sizeof(pthread_mutex_t)));
printf("return %d\n", pthread_mutex_init(plock, &attr));
fork() ? foobar(plock) : foobar(plock);
}
Run Code Online (Sandbox Code Playgroud)