小编bro*_*s94的帖子

在CMD中使用环境变量

我可以在Dockerfile中的CMD节中使用环境变量吗?

我想做这样的事情:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]
Run Code Online (Sandbox Code Playgroud)

其中$ MEMCACHE_11211_TCP_*将通过包含我的docker run命令的--link参数自动设置.用户可以在运行时配置$ ARG,可能是"-e"参数?

这对我来说似乎不起作用,例如,它似乎字面上通过字符串"$ ARG".

environment-variables docker

73
推荐指数
4
解决办法
4万
查看次数

LLVM蹦床有多少空间

我试图弄清楚如何在LLVM中使用trampoline内在函数.文档提到了存储蹦床所需的一些存储空间,这取决于平台.我的问题是,我如何计算出需要多少钱?

我发现这个例子,显然没有理由选择32个字节.如何选择一个好的价值?

declare void @llvm.init.trampoline(i8*, i8*, i8*);
declare i8* @llvm.adjust.trampoline(i8*);

define i32 @foo(i32* nest %ptr, i32 %val)
{
    %x = load i32* %ptr
    %sum = add i32 %x, %val
    ret i32 %sum
}

define i32 @main(i32, i8**)
{
    %closure = alloca i32
    store i32 13, i32* %closure
    %closure_ptr = bitcast i32* %closure to i8*

    %tramp_buf = alloca [32 x i8], align 4
    %tramp_ptr = getelementptr [32 x i8]* %tramp_buf, i32 0, i32 0
    call void @llvm.init.trampoline( …
Run Code Online (Sandbox Code Playgroud)

llvm

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

'in'关键字有什么用?

在Haskell中,为什么不在do-block中使用'in'和'let',否则你必须这样做?

例如,在下面有些人为的例子中:

afunc :: Int -> Int
afunc a = 
       let x = 9 in
       a * x

amfunc :: IO Int -> IO Int
amfunc a = do
       let x = 9
       a' <- a
       return (a' * x)
Run Code Online (Sandbox Code Playgroud)

这是一个很容易记住的规则,但我只是不明白它的原因.

syntax haskell

15
推荐指数
3
解决办法
4266
查看次数

在amd64上拆分堆栈是不必要的

似乎有一种观点认为在64位体系结构上使用"拆分堆栈"运行时模型是不必要的.我说似乎是,因为我还没有看到有人说过,只能围着它跳舞:

典型的多线程程序的内存使用量可能会显着降低,因为每个线程不需要最坏情况的堆栈大小.可以在32位地址空间中运行数百万个线程(完整的NPTL线程或协同例程).- 伊恩兰斯泰勒

...暗示64位地址空间已经可以处理它.

和...

...分离堆栈的持续开销和狭窄的用例(在32位体系结构上产生大量的I/O绑定任务)是不可接受的... - bstrie

两个问题:这是他们说的吗?其次,如果是这样,为什么它们在64位架构上不必要?

64-bit multithreading callstack go rust

15
推荐指数
2
解决办法
1219
查看次数

什么是克罗克福德定律?

最近有人提到了关于单子的"克罗克福德定律".谷歌在结果方面表现得很少.有人知道这是什么吗?

monads haskell functional-programming

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

这是什么?getproccount

这段代码发生了什么?从名称和上下文中可以找到机器上的核心数量,但它是如何工作的?什么都有点摆弄?

static int32
getproccount(void)
{
        uintptr buf[16], t;
        int32 r, cnt, i;

        cnt = 0;
        r = runtime·sched_getaffinity(0, sizeof(buf), buf);
        if(r > 0)
        for(i = 0; i < r/sizeof(buf[0]); i++) {
                t = buf[i];
                t = t - ((t >> 1) & 0x5555555555555555ULL);
                t = (t & 0x3333333333333333ULL) + ((t >> 2) & 0x3333333333333333ULL);
                cnt += (int32)((((t + (t >> 4)) & 0xF0F0F0F0F0F0F0FULL) * 0x101010101010101ULL) >> 56);
        }

        return cnt ? cnt : 1;
}
Run Code Online (Sandbox Code Playgroud)

注意:忽略·in runtime·sched_getaffinity,将该行视为一个任意库/系统调用,它执行名称和参数所暗示的操作.(在这种情况下,这个特定的呼叫来自 …

c bit-manipulation go

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

cmpq指令有什么作用?

我正在阅读syscall的以下定义:

.text
.globl syscall
.type   syscall,%function
.align 16
syscall:
    movq %rdi, %rax     /* Syscall number -> rax.  */
    movq %rsi, %rdi     /* shift arg1 - arg5.  */
    movq %rdx, %rsi
    movq %rcx, %rdx
    movq %r8, %r10
    movq %r9, %r8
    movq 8(%rsp),%r9    /* arg6 is on the stack.  */
    syscall         /* Do the system call.  */
    cmpq $-4095, %rax   /* Check %rax for error.  */
    jae __syscall_error     /* Branch forward if it failed.  */
    ret         /* Return to caller.  */

.size …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64

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

在保留CAP_SYS_NICE的同时删除根UID

我正在尝试编写一个守护进程,它将使用setuid位以root身份启动,但随后会快速恢复为运行该进程的用户.但是,守护程序需要保留将新线程设置为"实时"优先级的能力.我用来设置优先级的代码如下(一旦创建就在一个线程中运行):

struct sched_param sched_param;
memset(&sched_param, 0, sizeof(sched_param));
sched_param.sched_priority = 90;

if(-1 == sched_setscheduler(0, SCHED_FIFO, &sched_param)) {
  // If we get here, we have an error, for example "Operation not permitted"
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到问题的部分是设置uid,同时保留进行上述调用的能力sched_setscheduler.

我有一些代码在我的应用程序的主线程中运行接近启动:

if (getgid() != getegid() || getuid() != geteuid()) {
  cap_value_t cap_values[] = {CAP_SYS_NICE};
  cap_t caps;
  caps = cap_get_proc();
  cap_set_flag(caps, CAP_PERMITTED, 1, cap_values, CAP_SET);
  cap_set_proc(caps);
  prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
  cap_free(caps);
  setegid(getgid());
  seteuid(getuid());
}
Run Code Online (Sandbox Code Playgroud)

问题是在运行此代码后,我sched_setscheduler在上面的评论中提到了"不允许操作" .我究竟做错了什么?

c linux pthreads scheduler linux-capabilities

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

Sqlite subselect比distinct + order by快得多

我对以下两个产生相同输出的查询的运行时间截然不同感到困惑.查询在Sqlite 3.7.9上运行,在一个包含大约450万行的表上,每行产生约50行结果.

以下是查询:

% echo "SELECT DISTINCT acolumn FROM atable ORDER BY acolumn;" | time sqlite3 mydb
sqlite3 mydb  8.87s user 15.06s system 99% cpu 23.980 total


% echo "SELECT acolumn FROM (SELECT DISTINCT acolumn FROM atable) ORDER BY acolumn;" | time sqlite3 options
sqlite3 mydb  1.15s user 0.10s system 98% cpu 1.267 total
Run Code Online (Sandbox Code Playgroud)

这两个查询的表现不应该更接近吗?我理解,查询规划器可能会以不同的顺序执行"排序"和"不同"操作,但如果是这样,它是否需要?或者它应该能够弄清楚如何最快地完成它?

编辑:这里要求的是每个查询的"EXPLAIN QUERY PLAN"命令的输出.

对于第一个(单片)查询:

0|0|0|SCAN TABLE atable (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT
Run Code Online (Sandbox Code Playgroud)

对于第二个(子查询)查询:

1|0|0|SCAN TABLE atable (~1000000 rows)
1|0|0|USE TEMP B-TREE FOR …
Run Code Online (Sandbox Code Playgroud)

sqlite optimization

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

堆的边界是什么?

给定进程中堆的边界是什么?我理解这个问题可能没有简单的答案,所以我特别感兴趣的是以下答案:

  • 在AMD64上Linux下是否有64位进程的标准堆大小/位置?
  • 如果我正在实现一个语言运行库,我怎样才能找到我不允许放入堆的地方(同样,Linux/AMD64)
  • 应用程序是否有可移植的方式来查找它的开始/结束位置?

linux memory 64-bit heap-memory virtual-memory

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