小编Mic*_*rny的帖子

替换重要的符号链接'安全'

我想从bash脚本中更改符号链接的目标.问题是符号链接非常重要(/bin/sh就是这样),我想以时尚的方式做到:

  1. 删除旧目标后立即可以使用新目标,即不会有任何东西会注意到它消失,
  2. 改变将不会在中间失败,即离开用户删除了符号链接而没有新的符号链接.

我想到了两种方法.使用普通ln:

ln -fs /bin/bash /bin/sh
Run Code Online (Sandbox Code Playgroud)

或使用mv:

ln -s /bin/bash /bin/sh.new
mv /bin/sh.new /bin/sh
Run Code Online (Sandbox Code Playgroud)

哪一个更适合我的需求?是否有可能其中一个会尝试替换符号链接目标而不是符号链接本身?

bash symlink

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

什么posix_fadvise()args用于顺序文件写入?

我正在开发一个顺序写入大文件(并且根本不读取)的应用程序,我想posix_fadvise()用来优化文件系统行为.

联机帮助页中的功能描述表明最合适的策略是POSIX_FADV_SEQUENTIAL.但是,Linux实现描述怀疑:

在Linux下,POSIX_FADV_NORMAL将预读窗口设置为后备设备的默认大小; POSIX_FADV_SEQUENTIAL 将此大小加倍,并POSIX_FADV_RANDOM完全禁用文件预读.

因为我只是在写数据(可能也会覆盖文件),所以我不希望有任何预告.我应该坚持使用POSIX_FADV_SEQUENTIAL或更确切地说使用POSIX_FADV_RANDOM它来禁用它吗?

其他选项怎么样,比如POSIX_FADV_NOREUSE?或者根本不posix_fadvise()用于写作?

c optimization posix

17
推荐指数
2
解决办法
7158
查看次数

对于不同类型的T,sizeof(std :: list <T>)会有所不同吗?

我可以假设对于任何类型T,类型std::list<T>将具有相同的,恒定的大小?只是为了说清楚,我的意思是'main'类型本身的大小,而不是它分配的内存.

假设我自己的大小T只会影响使用分配器分配的列表节点的大小,这似乎是合乎逻辑的.

但是,有两件事可能会导致sizeof(std::list<T>)我能想到的变量:

  1. 一个标准的C++库,试图std::list通过将一些T实例放入std::list<T>自身来"优化" 类型.这对我来说似乎是一个坏主意,它可能打破了标准所要求的"恒定时间"要求;
  2. 标准C++,具有std::list<T>某些类型的库特化,具有不同大小的特化.

我想不出(1)或(2)的任何用途,但我可能错了.

我想要实现的是使用固定大小的切片分配器来使用std::list<T>内部的模板类.


作为注释:这是关于不同类型的差异T,而不是针对不同的分配器.我将明确控制所有实例化,并且它们都将使用std::allocator.

c++ stl

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

'const'双重复制+比较安全吗?

我注意到有很多关于浮点计算错误主题的讨论,要求你使用比复杂的更复杂的比较==.然而,所有这些文章似乎都假设值以某种方式被操纵(或双重计算),而我没有看到一个涵盖非常简单的常量复制的示例.

请考虑以下事项:

const double magical_value = -10;

class Test
{
    double _val;

public:
    Test()
        : _val(magical_value)
    {
    }

    bool is_special()
    {
        return _val == magical_value;
    }
};
Run Code Online (Sandbox Code Playgroud)

据我所知,magical_value应该在编译时设置,以便在该点进行所有舍入.之后,应该将值复制到类中,并与原始值进行比较.这样的比较是否保证安全?或者可以复制或比较在这里引入错误?

请不要建议替代比较或魔法价值使用方法,这是另一个主题.我只是对这个假设感到好奇.

编辑:请注意,我有点担心在某些体系结构上,优化可能会导致将值复制到不同大小的浮点寄存器,从而引入精确值的差异.有类似的风险吗?

c++ floating-point

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

根据CSS中的计数器值设置边距(缩进)

我想知道是否可以margin-left使用CSS3基于计数器的值设置元素.

换句话说,拥有这样的HTML:

<section>A</section>
<section>B</section>
<section>C</section>
Run Code Online (Sandbox Code Playgroud)

有第一块,有margin-left: 0em第二块,1em依此类推.

到目前为止,我尝试过以下方法:

section
{
    counter-increment: sect-indent;
    margin-left: calc(counter(sect-indent) * 1em);
}
Run Code Online (Sandbox Code Playgroud)

但似乎calc()不支持获得计数器值.

使用CSS3有可能这样吗?我对涉及ECMAScript的解决方案不感兴趣.

css

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

gdb,为什么"下一步"显示每个源代码行两次?

每个人,当在gdb中使用"next"指令时,我发现每行源代码显示两次-----我很确定,这些代码不在任何循环中.这是现象:

(gdb) frame
#0  ap_get_client_block (r=0x8560d48, 
    buffer=0xb68501b7 "<?xml version=\"1.0\" encoding=\"utf-8\"?><Root><OperCode>SMS101</OperCode><AppId>SMSMsgFilterReq</AppId><Req><UserMobile>13925237429</UserMobile><SendMsg>abc?34¨?23a?07\214?21??237?11??215?10°?214?27??227?07\214??,hao"..., bufsiz=81920) at http_filters.c:1540
1540        if (r->remaining < 0 || (!r->read_chunked && r->remaining == 0)) {
(gdb) n
1544        bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
(gdb) 
1545        if (bb == NULL) {
(gdb) 
1544        bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
(gdb) 
1545        if (bb == NULL) {
Run Code Online (Sandbox Code Playgroud)

----- 1544,1545行没有任何循环,但是他们重复了.愿任何人开导我吗?

c c++ gdb

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

使用-Wl实现与共享库的链接, - 根据需要(仅提供模板时)

我正在创建一个仅模板的C++库.但是,我还想提供一个"空"共享库,这样通过控制SONAME,只要模板发生变化,导致实例化模板ABI不兼容,我就能够强制重建模板使用者.

遗憾的是,如果特定用户-Wl,--as-needed在其中LDFLAGS,链接器将删除我的共享库,NEEDED因为已编译的可执行文件不从它请求任何符号.如何确保程序始终链接到我的库,最好不要引入不必要的虚函数调用(或者如果我必须这样做,使它们负担最小)?

编辑:作为注释,特定模板类提供静态方法,通常只使用那些静态方法.因此,依赖构造函数中的任何内容并不是一个好主意,而且我真的希望避免通过某种强制执行来加重所有方法的负担.


受到@EmployedRussian的启发,我实现了:

extern int dummy;

namespace
{
    struct G
    {
        inline G()
        {
            dummy = 0;
        }
    };

    static const G g;
}
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,对包括头文件在内的每个单元执行一次赋值.

c++ templates shared-libraries

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

mmap()和锁定文件

请考虑以下代码段(错误处理故意丢失):

void* foo(const char *path, off_t size) {
    int fd;
    void *ret;

    fd = open(path, O_RDWR);
    lockf(fd, F_LOCK, 0);
    ret = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    close(fd);
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

所以,想法是打开一个文件,mmap()它只返回数据指针.如果文件也可以在mmap时间锁定,那将会很棒.

每个mmap(3p):

mmap()函数应添加对与文件描述符fildes关联的文件的额外引用,该文件描述符fildes不会被该文件描述符上的后续close()删除.当没有更多映射到文件时,应删除此引用.

但是lockf(3p):

文件锁应在第一次关闭时通过文件的任何文件描述符的锁定过程释放.

所以,使用lockf()我必须保持fd打开并在非常长的时间内提供它的参考.是否有更好的可移植方法来确保文件被锁定直到munmap()被调用?

c posix locking mmap

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

比特字段可以用作"穷人"的快速整数类型吗?

我刚刚注意到gcc关于位域的一个有趣的属性.如果我创建struct如下:

template <int N>
struct C
{
    unsigned long long data : N;
};
Run Code Online (Sandbox Code Playgroud)

然后在amd64:

  1. 使用-m64,对于Nε< 1,64 > sizeof(C) == 8;
  2. 对于-ε32,对于 < 1,32>,对于 < 33,64sizeof(C) == 4 > , sizeof(C) == 8.

(带sizeof(unsigned long long) == 8).

这看起来大部分类似于C99/C++ 11,uint_fastXX_t除了在我的系统上的事实sizeof(uint_fast8_t) == 1.但是,例如,我无法复制任何类似的东西__int128(总是导致sizeof(C) == 16).

在C++ 98中使用前面提到struct的"穷人"替代品似乎是个好主意吗?uint_fastXX_t

c++

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

cd 后 umask 设置更改

我有一些奇怪的事情要报告。在我新配置的 RHEL5 服务器上,我的 shell 设置为 /bin/bash 我在 .bashrc 中将 umask 设置为 002。

当我第一次登录时,umask 似乎工作正常:

$ touch a
$ ls -l a
-rw-rw-r-- etc.....
Run Code Online (Sandbox Code Playgroud)

如果我创建另一个文件,它可以工作:

$ touch b
$ ls -l b
-rw-rw-r-- etc.....
Run Code Online (Sandbox Code Playgroud)

但是...如果我更改目录(到任何目录),则 umask 将设置回 022:

$ cd /var/www/whatever
$ touch c
$ ls -l c
-rw-r--r-- etc.....
Run Code Online (Sandbox Code Playgroud)

完全奇怪。

有人见过这样的吗?他们能想出什么要检查的吗?

为什么 umask 设置会在 cd'ing 后改变?

谢谢,

-查理

linux redhat umask

5
推荐指数
2
解决办法
1167
查看次数

标签 统计

c++ ×5

c ×3

posix ×2

bash ×1

css ×1

floating-point ×1

gdb ×1

linux ×1

locking ×1

mmap ×1

optimization ×1

redhat ×1

shared-libraries ×1

stl ×1

symlink ×1

templates ×1

umask ×1