假设我的主文件夹中有〜/ a/b文件夹,文件夹b包含一个名为'symlink'的'..'的符号链接.然后我在bash中执行以下操作:
hm@mach:~$ cd a/b/symlink
hm@mach:~/a/b/symlink$ pwd -P
/home/hm/a
hm@mach:~/a/b/symlink$ cd ..
hm@mach:~/a/b$ pwd -P
/home/hm/a/b
Run Code Online (Sandbox Code Playgroud)
pwd -P打印当前工作目录,取消引用所有符号链接.为什么工作目录/ home/hm/a/b在最后,而不是/ home/hm?
我在不同来源阅读了几次(例如维基百科:http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size),在C中,长的长不小于长,这不小而不是一个不小于短的int.
但是,我已经在C90和C99标准中查明了这一点,并且没有找到相应的条款.我发现只有C90和C99规定了最小型号(C90和C99标准中的第5.2.4.2.1节),而不是它们相互之间的尺寸.我错过了标准中的某些内容吗?
script1.sh:
#!/bin/bash
./script2.sh
echo after-script
Run Code Online (Sandbox Code Playgroud)
script2.sh:
#!/bin/bash
function handler {
exit 130
}
trap handler SIGINT
while true; do true; done
Run Code Online (Sandbox Code Playgroud)
当我从终端启动script1.sh,然后使用Ctrl + C将SIGINT发送到其进程组时,该信号被script2.sh捕获,当script2.sh终止时,script1.sh将打印"after-script".但是,我原本希望script1.sh在调用script2.sh的行之后立即终止.为什么在这个例子中不是这种情况?
补充说明(编辑):
由于script1.sh和script2.sh位于同一进程组中,因此在命令行上按Ctrl + C时,会将SIGINT发送到这两个脚本.这就是为什么我不希望script2.sh在script2.sh退出时继续.
当注释掉script2.sh中的"陷阱处理程序SIGINT"行时,script1.sh会在script2.sh存在后立即退出.我想知道为什么它的行为不同,因为script2.sh只产生相同的退出代码(130).
我编写了一个测试程序,它只包含一个内部有一些计算的无限循环,并且不执行任何I/O操作.我尝试启动程序的两个实例,一个具有高漂亮度值,另一个具有低漂亮度值:
sudo nice -n 19 taskset 1 ./test
sudo nice -n -20 taskset 1 ./test
Run Code Online (Sandbox Code Playgroud)
taskset命令确保两个程序在同一核心上执行.与我的预期相反,顶级报告称两个程序都获得了大约50%的计算时间.这是为什么?nice命令是否有效?
考虑以下代码:
volatile int a;
volatile int b;
int x;
void func() {
a = 1;
x = 0; /* dummy statement */
b = 2;
}
Run Code Online (Sandbox Code Playgroud)
在此代码段中,对x的赋值构成了一个序列点.因此,根据C90标准,必须在开始访问b之前完成对volatile变量a的访问.将这段代码翻译成x86-64汇编程序时,函数体将翻译如下:
movl $1, a(%rip)
movl $0, x(%rip)
movl $2, b(%rip)
Run Code Online (Sandbox Code Playgroud)
现在,当执行该代码时,CPU可以重新排序存储器访问,从而破坏了C标准的要求,即按顺序执行对a和b的访问.那么,这个翻译是不正确的,编译器是否不得不插入内存障碍来强制执行排序?
编辑:考虑a和b是由两个线程共享的变量的情况.在这种情况下,两个线程之间的同步协议可能依赖于对a和b的访问按顺序发生的事实.因此,当CPU重新排序访问时,这可能会破坏该协议(我实际上并没有尝试实现这样的协议,我只是想知道C标准的正确解释是什么).
我试图找出errno何时发生变化.
起初,我在gdb中尝试了"watch errno",这导致了错误
Cannot find thread-local variables on this target
Run Code Online (Sandbox Code Playgroud)
我能够通过编译"-pthread"来解决这个问题.但是,它仍然不起作用,我现在得到错误
Cannot find shared library `/usr/lib/debug/lib/x86_64-linux-gnu/libc-2.13.so' in dynamic linker's load module list
Run Code Online (Sandbox Code Playgroud)
当我输入"watch errno"时.我需要做什么才能在errno上设置观察点?