小编Mar*_*eck的帖子

为什么Bash模式匹配?(*[[:class:]])foobar缓慢?

我有一个文本文件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)

瞬间的.但这只是上面的第二种选择,没有第一种选择.

那么为什么这么久?

regex bash

3
推荐指数
1
解决办法
367
查看次数

我可以在Python中使用"静态"变量的匿名函数吗?

我可以在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是匿名的,并且是独立的.

python lambda

3
推荐指数
1
解决办法
497
查看次数

在Python中,有没有办法对列表和元组组成的列表进行排序?

那种ab我一样的预期,为什么会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)

python

3
推荐指数
1
解决办法
68
查看次数

如何正确等待 execve 完成?

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)

c linux shell

3
推荐指数
1
解决办法
9601
查看次数

Linux shell和文件系统如何识别Unicode?

我知道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吗?

linux unicode shell utf-8

3
推荐指数
1
解决办法
430
查看次数

ptrdiff_t为什么不长久一样?

根据当前的C标准,指针之间的差异有类型ptrdiff_t.同时,根据标准,数组的下标可以是任何整数类型,并且当前是最大的有符号整数类型long long.

如果ptrdiff_t不是long long,但更小,那么上述两个陈述将是矛盾的,不是吗?

那么为什么标准会引入类型ptrdiff_t而不只是long long用作指针差异?

c

3
推荐指数
1
解决办法
355
查看次数

为什么我不能在qr下连接在编译和运行时评估的模式?

为什么这个炸弹

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.

regex perl

2
推荐指数
1
解决办法
86
查看次数

如何找出LD_PRELOAD要拦截哪些函数?

我试图拦截所有动态加载的函数,这些函数使用openatcomm.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 elf ld-preload

2
推荐指数
1
解决办法
1158
查看次数

如何查看应用程序命令期间访问哪些文件?

如果我在Linux中运行一些命令行应用程序,如何判断该进程访问(读取和/或写入)哪些文件?我想我需要在文件系统驱动程序中放置一些钩子并重新编译内核,或类似的东西?有没有更简单的方法?

linux linux-device-driver

1
推荐指数
1
解决办法
98
查看次数

为什么 eval 弄乱了 printf '\n',以及在哪里可以找到有关 eval 的信息

我之前有一个关于 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)

不像以前那样工作

bash

1
推荐指数
1
解决办法
811
查看次数

复杂的奇怪错误信息,但合法的Perl单线程

>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; 减少任何一个字符,并且不显示错误消息.

perl

0
推荐指数
1
解决办法
80
查看次数

如何让pthread_mutex_lock()阻止而不是成功?

我以为我认识C和互斥体......显然我没有.

下面的代码,我希望打印地址,等待5秒,然后再次打印相同的地址.

它没有 - 它打印两次相同的地址,但立即,为什么?

我编译代码

>gcc -lpthread foobar.c
Run Code Online (Sandbox Code Playgroud)

我一定不明白一些明显的东西,这是令人尴尬的......

根据Jonathan Leffler和Chris Dodd以及user3629249的建议,我编写了如下代码,同样的问题.这变得非常尴尬......

foob​​ar.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)

c linux pthreads

0
推荐指数
1
解决办法
82
查看次数

标签 统计

linux ×5

c ×3

bash ×2

perl ×2

python ×2

regex ×2

shell ×2

elf ×1

lambda ×1

ld-preload ×1

linux-device-driver ×1

pthreads ×1

unicode ×1

utf-8 ×1