小编Dig*_*uma的帖子

为什么没有包含更高字节EAX的寄存器?

%AX = (%AH + %AL)

那么为什么不%EAX = (%SOME_REGISTER + %AX)注册%SOME_REGISTER呢?

x86 assembly

65
推荐指数
3
解决办法
5万
查看次数

使用Applescript执行复杂的击键

我正在尝试在Automator中编写一个Applescript,按住左箭头按钮,同时按住控制,选项和命令.我到目前为止的代码是:

on run {input, parameters}

    tell application "System Events"
        tell application "Sublime Text 2" to activate
        keystroke "left" using {control down, option down, command down}
    end tell

    return input
end run
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.有关如何修复此代码的任何建议?谢谢!

applescript

20
推荐指数
2
解决办法
3万
查看次数

bash命令组:为什么花括号需要分号?

在bash中对命令进行分组时,我知道括号()和花括号之间的目的不同.{}

但是为什么花括号构造在最后一个命令后需要分号,而对于括号构造,分号是可选的?

$ while false; do ( echo "Hello"; echo "Goodbye"; ); done
$ while false; do ( echo "Hello"; echo "Goodbye" ); done
$ while false; do { echo "Hello"; echo "Goodbye"; }; done
$ while false; do { echo "Hello"; echo "Goodbye" }; done
bash: syntax error near unexpected token `done'
$ 

我正在寻找一些有关为何情况的见解.我不是在寻找诸如"因为文档说的那样""因为它是按照这种方式设计"的答案.我想知道为什么它的设计是这样的.或者,如果它只是一个历史文物?

至少在以下版本的可以观察到这种情况:

  • GNU bash,版本3.00.15(1)-release(x86_64-redhat-linux-gnu)
  • GNU bash,版本3.2.48(1)-release(x86_64-apple-darwin12)
  • GNU bash,版本4.2.25(1)-release(x86_64-pc-linux-gnu)

syntax bash grouping parentheses braces

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

初始化固定大小的char数组时没有编译器错误,没有足够的空间用于null终止符

假设我有以下c char数组:

char okaysize4[5] = "four";   // line 5
char toosmall4[4] = "four";   // line 6
char toosmall3[3] = "four";   // line 7
Run Code Online (Sandbox Code Playgroud)

当我使用gcc 4.4.7编译时,我收到以下错误:

array.c:7:警告:chars数组的初始化字符串太长

第7行预计会出现此错误,因为我试图将5个字符填充("four" + \0)到3个元素数组中.第5行也没有错误,因为5元素数组足够大.

然而,我很惊讶第6行没有类似的错误.最终初始化的toosmall4是未终止的字符串,这可能会导致各种麻烦.

我的理解是"four",由于null终止符,c字符串文字应该是五个字符长.实际上sizeof("four")是5.那么为什么编译器不会在这里给出错误?

有没有什么方法可以改变我的声明/定义/初始化,以便在这种情况下标记错误?

c arrays compiler-errors initialization char

14
推荐指数
2
解决办法
1282
查看次数

显示foreach/eval/call扩展的结果

我正在尝试为大型项目调试makefile,我正在努力define TEMPLATE/ endefforeach/ eval/ call构造.特别是我认为我很难弄清楚我需要引用哪些变量$以及需要引用哪些变量$$.

我认为如果我可以在变量扩展之前看到eval/ callexpansion 的实际结果,我会更容易调试.

举例来说,如果我们使用的例子EVAL文档,我们有以下的makefile片段:

 PROGRAMS    = server client

 server_OBJS = server.o server_priv.o server_access.o
 server_LIBS = priv protocol

 client_OBJS = client.o client_api.o client_mem.o
 client_LIBS = protocol
...
 define PROGRAM_template =
  $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
  ALL_OBJS   += $$($(1)_OBJS)
 endef

 $(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
Run Code Online (Sandbox Code Playgroud)

我认为foreach在变量扩展之前,这应该有效地扩展到以下内容:

server: $(server_OBJS) $(server_LIBS:%=-l%)
ALL_OBJS   += $(server_OBJS)

client: $(client_OBJS) $(client_LIBS:%=-l%)
ALL_OBJS   += $(client_OBJS)
Run Code Online (Sandbox Code Playgroud)

我手动想出了上面的扩展(更正欢迎),但我正在寻找一种通用的方法来展示这个扩展以获得更复杂的例子.这种方法存在吗?

我已经研究过 …

debugging foreach makefile eval

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

一个配方和并行执行的多个目标

我有一个项目,其中包括一个代码生成器,它只需一次调用代码生成器就可以从一个输入文件生成几个.c和.h文件.我有一个规则,其中.c和.h文件作为多个目标,输入文件作为先决条件,配方是代码生成器的调用.然后我有进一步的规则来编译和链接生成的.c文件.

这可以正常使用-j因子为1,但如果我增加j因子,我发现我得到了代码生成器的多次调用,直到-j因子或预期目标文件的数量,以最小者为准.这很糟糕,因为代码生成器的多次调用可能会因生成的代码被多次写入而导致失败.

我不打算在这里发布我的实际(大)代码,但我已经能够构建一个似乎表现出相同行为的小例子.

Makefile看起来像这样:

output.concat: output5 output4 output3 output2 output1
    cat $^ > $@

output1 output2 output3 output4 output5: input
    ./frob input

clean:
    rm -rf output*

对于此示例,我编写了一个简单的shell脚本,frob而不是代码生成器,它从一个输入文件生成多个输出文件:

#!/bin/bash

for i in {1..5}; do
    {
    echo "This is output${i}, generated from ${1}. input was:"
    cat ${1}
    } > output${i}
done

当我使用非统一-j因子运行此Makefile时,我得到以下输出:

$ make -j2 
./frob input
./frob input
cat output5 output4 output3 output2 output1 > output.concat
$

我们看到./frob这里被调用了两次,这很糟糕.有没有什么方法可以构造这个规则,使配方只被调用一次,即使是非统一-j因子?

我考虑过更改规则,以便只有一个预期的输出文件是目标,然后添加另一个没有配方的规则,使其目标是剩余的预期输出文件,先决条件是第一个预期的输出文件.但我不确定这会起作用,因为我不知道我是否可以保证生成文件的顺序,因此可能最终会产生循环依赖.

parallel-processing makefile gnu-make

11
推荐指数
3
解决办法
4058
查看次数

从管道执行二进制的内容

简而言之,如何运行bash压缩脚本?,但这可以用二进制文件而不是shell脚本完成吗?


假设我有一个压缩成.gz的二进制文件.我可以解压缩到管道并检查内容:

$ gzip -d --stdout hello.gz | file -
/dev/stdin: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
$ 

而不是将此输出传递给命令,是否有任何方法可以实际执行管道本身的内容,而无需将其写入文件?

我考虑使用命名管道,但这似乎不起作用:

$ mkfifo execpipe
$ chmod 777 execpipe
$ gzip -d --stdout hello.gz > execpipe &
[3] 30034
$ ./execpipe 
bash: ./execpipe: Permission denied
$ [3]+  Broken pipe             gzip -d --stdout hello.gz >execpipe

$ 

有没有办法在不创建实际文件的情况下执行管道内容?

linux shell executable pipe

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

Bash:搜索目录树

我有一个源代码树,其根类似于/home/me/workspace.有很多级别的子目录很多.特别是有一个包含一些工具的路径:

/home/me/workspace/tools/scripts
Run Code Online (Sandbox Code Playgroud)

我正在写一个bash函数,我可以从树中的任何地方调用我传递字符串tools/scripts.该函数应该从当前工作目录迭代到/寻找路径片段tools/scripts,然后如果找到它,则打印出找到它的绝对路径.在这个例子中,/home/me/workspace将被打印.如果根本找不到路径片段,则不打印任何内容.

我已经有了以下bash函数,它为我做了这个:

search_up ()
(
    while [ $PWD != "/" ]; do
        if [ -e "$1" ]; then
            pwd
            break
        fi
        cd ..
    done
)
Run Code Online (Sandbox Code Playgroud)

但这似乎有点啰嗦.我想知道是否有任何其他方法可以在bash本身,或者可能是单个find命令或任何其他常见实用程序中执行此操作.我特别期待可读性和简洁性.

注意我不是在寻找整个树的完整递归搜索.

我的bash也不是最新的,所以请不要使用最新的,最棒的:

$ bash --version
GNU bash, version 3.00.15(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
$
Run Code Online (Sandbox Code Playgroud)

bash shell

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

0xfbad8001回溯中的幻数

我正在查看我在GDB中调试的程序的以下回溯:

Thread 7 (Thread 3983):
#0  0xf7737430 in __kernel_vsyscall ()
#1  0x41b85412 in __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S:142
#2  0x41b80d6d in _L_lock_686 () from libpthread.so.0
#3  0xfbad8001 in ?? ()
#4  0x080eac80 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)

特别是我对0xfbad8001的帧地址及其含义感兴趣.

该平台基于x86,因此该未对齐地址无效.鉴于"坏"被编码为十六进制值,我猜这是一个神奇的数字,但到目前为止,我还无法确定是谁设置了这个值或为什么.我试图在谷歌和在线LXR数据库中搜索内核和glibc,但是没有发现任何实际设置此值的代码行.

如果我谷歌搜索"fbad8001",那么有许多点击在回溯和内存转储中显示此地址.所以这个特殊值似乎有一些意义,我假设它是某个地方的神奇数字,但到目前为止我还没能找到设置它的代码.

谁设定了这个值,它意味着什么?

内核基于Linux 3.4.10,glibc为2.15.


除了内核和glibc源代码外,我还通过gcc,gdb和binutils源代码,但仍然没有看到任何吸烟枪.我不知道还能在哪里看.

c debugging gdb magic-numbers backtrace

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

使用模数计算

我正在解决一个问题:用户输入3个树高和树高限制.然后程序计算要删除的树的数量.

样本输入:

 Tree1: 14
 Tree2: 7
 Tree3: 16

 Tree limit: 11
Run Code Online (Sandbox Code Playgroud)

样本输出:

 Amount to remove: 8
Run Code Online (Sandbox Code Playgroud)

这对我来说通常不会太糟糕,虽然我还是初学者,但问题是,我将在没有if语句的情况下计算它.我必须使用Modulus来计算.我花了很长时间研究和尝试不同的东西,但我似乎无法得到它?有任何想法吗?

c algorithm operators modular-arithmetic

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