小编Mar*_*eck的帖子

为什么openat()需要避免使用stat然后open()的两步竞争条件?

解释在

http://man7.org/linux/man-pages/man2/open.2.html

关于为什么openat需要,请参阅:

openat()允许应用程序避免在使用open()打开当前工作目录以外的目录中的文件时可能发生的竞争条件.这些竞争条件是由于open()的目录前缀的某些组件 可以与open()的调用并行更改.例如,假设我们希望在文件 路径/到/ xxx存在时创建文件路径/到/ xxx.dep.问题是在存在检查和文件创建步骤之间,可以修改path或to(可能是符号链接)以指向不同的位置.

我不明白为什么这场比赛是一个问题.如果一个应用程序想要检查是否存在某个文件,如果是,则创建一个不同的文件,然后,这当然是两个步骤,应用程序要么应该确保之间没有任何干扰,要么接受做两个的后果 - 步骤操作.只有在单个调用open()可能导致竞争条件时,才可能openat()需要其他一些系统调用.否则,这不是系统调用解决的问题,但应用程序负责处理.

我在这里不理解什么?

linux-kernel

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

如何在`bash -c`下执行任意命令

什么是装饰任意bash命令以在子shell中执行它的过程?我不能改变命令,我必须在外面装饰它.

我能想到的最好的是

>bash -c '<command>'
Run Code Online (Sandbox Code Playgroud)

适用于这些:

>bash -c 'echo'
>bash -c 'echo foobar'
>bash -c 'echo \"'
Run Code Online (Sandbox Code Playgroud)

但是诸如此类的命令呢?

echo \'
Run Code Online (Sandbox Code Playgroud)

特别是

echo \'\"
Run Code Online (Sandbox Code Playgroud)

所有命令的装饰必须始终相同.它必须始终有效.

bash

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

类型映射中的SWIG可以工作,但是argout没有

我有这个文件 foobar.h

class Foobar {
public: void method(int arg[2]) {};
};
Run Code Online (Sandbox Code Playgroud)

在将SWIG接口编译为Python之后,如果我尝试从Python运行此方法,它说

TypeError: in method 'Foobar_method', argument 2 of type 'int [2]'
Run Code Online (Sandbox Code Playgroud)

当然.所以我写了这个SWIG类型映射:

%typemap(in) int [2] {}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,Python运行这个方法而不抱怨.所以我想,我理解如何编写一个类型图.

但是,如果我将typemap更改为argout:

%typemap(argout) int [2] {}
Run Code Online (Sandbox Code Playgroud)

现在,Python回到了之前的错误.

我只是直接从SWIG手册中做到这一点,这应该没有那个错误,就像intypemap 一样.

我究竟做错了什么???

python swig

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

为什么Python lint要求我使用不同的局部变量名而不是全局变量名

给定Python代码如

def func():
    for i in range(10):
        pass

for i in range(10):
    pass  
Run Code Online (Sandbox Code Playgroud)

pylint抱怨

Redefining name 'i' from outer scope 
Run Code Online (Sandbox Code Playgroud)

什么是Pythonic写上面的方法?在本地使用不同的变量,比方说j

但是,当变量在两种情况下(i对于索引)意味着完全相同时,为什么呢.假设我将所有本地索引更改为j,然后我发现我想j用作glocal范围中的第二个索引.要改变一下吗?

我无法禁用lint警告,我不想拥有它们,我想写Pythonic,但我想在同样的事情中使用相同的名称,在上面的简单情况下.这不可能吗?

python pylint

10
推荐指数
2
解决办法
6377
查看次数

你总能在C中访问包含结构数据的适当对齐的缓冲区吗?

我在C中有结构类型的数据:

typedef struct {
  type0 field0;
  type1 field1;
} foo_struct;

foo_struct foo;
Run Code Online (Sandbox Code Playgroud)

现在假设我在虚拟内存中以某种方式分配了一个大小的缓冲区 sizeof(foo_struct)

char *buf = <some allocation method>
Run Code Online (Sandbox Code Playgroud)

然后我将数据从中复制foobuf,例如memcpy.

然后我想像这样访问字段buf:

((foo_struct *)buf)->fieldn
Run Code Online (Sandbox Code Playgroud)

这是否保证(通过C11标准)始终有效?

在另一个问题(关于不同的主题)中的人似乎在说,是的,这保证可行,特别是如果buf在页面边界上有良好对齐的话.

是的,它实际上是有保证的.但我认为,无论它是"对齐",页面边界或者不是这样,它都没有100%的标准保证.在那儿?

c c11

9
推荐指数
2
解决办法
238
查看次数

为什么Perl回溯匹配失败似乎比匹配成功花费更少的时间?

我有一个巨大的文件aab.txt,其内容是aaa... aab.

令我惊讶的是

perl -ne '/a*bb/' < aab.txt
Run Code Online (Sandbox Code Playgroud)

运行(匹配失败)比快

perl -ne '/a*b/' < aab.txt
Run Code Online (Sandbox Code Playgroud)

(匹配成功).为什么????两者都应首先吞噬所有的a,然后第二个立即成功,而第一个将不得不一遍又一遍地回溯,失败.

regex perl

8
推荐指数
2
解决办法
147
查看次数

namedtuple return和它的typename参数有什么区别?

Python文档说:

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
Returns a new tuple subclass named typename. 
Run Code Online (Sandbox Code Playgroud)

它举了一个例子

>>>Point = namedtuple('Point',...

在我能找到的所有例子中,返回namedtuple和参数typename的拼写是相同的.

试验,似乎论证无关紧要:

>>>Class = collections.namedtuple('Junk', 'field')
>>>obj = Class(field=1)
>>>print obj.field
1
Run Code Online (Sandbox Code Playgroud)

有什么区别?typename论证如何重要?

python

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

必须 sizeof(void*) &gt;= sizeof(size_t) 吗?

这里有一个关于sizeof(size_t)和相等的问题sizeof(void*),公认的答案是它们不能保证相等。

但至少,必须是:

sizeof(void*) >= sizeof(size_t)

我想是这样。因为,取给定 C 实现中可能的最大存储对象,大小为S。现在,存储区域可以被认为是大小为 的字节数组S。因此,必须有一个指向每个字节的指针,并且所有这些指针都是可比较的和不同的。因此,类型 的不同元素的数量void*必须至少是类型 的最大数量size_t,这是无符号整数类型。因此sizeof(void*) >= sizeof(size_t)

我的推理有道理吗?

c language-lawyer

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

为什么在初始化之前通过LD_PRELOAD加载库?

在下面的最小示例中,通过LD_PRELOAD函数加载的库可以拦截fopen并且openat在初始化之前显然正在运行.(Linux是CentOS 7.3).为什么??

库文件comm.c:

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <fcntl.h>

typedef FILE *(*fopen_type)(const char *, const char *);

// initialize to invalid value (non-NULL)
// init() should initialize this correctly
fopen_type g_orig_fopen = (fopen_type) 1;

typedef int (*openat_type)(int, const char *, int, ...);
openat_type g_orig_openat;

void init() {
    g_orig_fopen = (fopen_type)dlsym(RTLD_NEXT,"fopen");
    g_orig_openat = (openat_type)dlsym(RTLD_NEXT,"openat");
}

FILE *fopen(const char *filename, const char *mode) {
    // have to do this here …
Run Code Online (Sandbox Code Playgroud)

linux ld-preload

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

如何仅针对多行字符串禁用伪造的 pylint 警告

如何仅针对该字符串禁用多行字符串的虚假 pylint 警告?

第一个禁用有效,第二个(虚假警告)无效。

在初步回答后编辑了一个更简单的例子。

#!/usr/bin/env python

print 0!= 1 # pylint: disable=C0322
print {''
# pylint: disable=C0322
: '''%      
'''
# pylint: enable=C0322
}
Run Code Online (Sandbox Code Playgroud)

我得到

************* Module foobar
C0322:  4: Operator not preceded by a space
print {''

: '''%
     ^
Run Code Online (Sandbox Code Playgroud)

python pylint

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

标签 统计

python ×4

c ×2

pylint ×2

bash ×1

c11 ×1

language-lawyer ×1

ld-preload ×1

linux ×1

linux-kernel ×1

perl ×1

regex ×1

swig ×1