这可能听起来微不足道,但我很确定这个问题没有被问过,或者至少我找不到它.
我正在寻找一种方法来构建一个无限等待(不一定是一个循环)与shell脚本,以便它永远等待,并可以被杀死(或技术上,接收一个SIGTERM).以下是已知的可能的构造和反对它们的参数:
while true; do sleep 1; done这几乎得到它,但由于sleep是一个外部命令,当我发送SIGTERM到正在运行的脚本时,它必须等待sleep先完成然后处理信号.换成sleep 1类似的东西sleep 10,滞后很明显.该解决方案每1秒唤醒一次CPU,这并不理想.while true; do read; donestdintty 时这是完美的.read是一个内置的shell,SIGTERM立即到达脚本.但是,当stdin是/dev/null时,脚本吃掉的无奈运行所有的CPU read永远都在/dev/null.因此,需要一个永远等待的shell内置构造.通过略读man dash我没有找到这样的一个-唯一的阻挡内建有read和wait,和我没有想法,我怎么可以构建采用理想的一个wait.
答案应该适用于POSIX shell(有效dash),或者不太适合Bash.
补充说明.
第一个例子不能完美运行的情况比我想象的要复杂得多.使用以下shell脚本:
#!/bin/sh
echo $$
while true; do
sleep 100
done
Run Code Online (Sandbox Code Playgroud)
如果你在另一个tty杀死它,它会立即终止.当你试图捕捉时,有趣的事情就开始了.使用此脚本:
#!/bin/sh
at_term() {
echo 'Terminated.' …Run Code Online (Sandbox Code Playgroud) Clang有一个非常酷的扩展名为block,它将真正的lambda函数机制引入C语言.与block相比,gcc的嵌套函数非常有限.但是,尝试编译一个简单的程序c.c:
#include <stdio.h>
int main() {
void (^hello)(void) = ^(void) {
printf("Hello, block!\n");
};
hello();
return 0;
}
有clang -fblocks c.c,我得到了
/usr/bin/ld.gold: /tmp/cc-NZ7tqa.o: in function __block_literal_global:c.c(.rodata+0x10): error: undefined reference to '_NSConcreteGlobalBlock' clang: error: linker command failed with exit code 1 (use -v to see invocation)
似乎我应该使用clang -fblocks c.c -lBlocksRuntime,但后来我得到了
/usr/bin/ld.gold: error: cannot find -lBlocksRuntime (the rest is the same as above)
任何提示?
我正在寻找一种将浮点数转换为有理数的算法,以便保证有理数计算回原始浮点数,并且分母被最小化。
一个简单的算法只能将浮点数的实际值返回为 X / 2 N,但对于不是有限二进制分数的任何东西,2 N往往非常大。例如,数字 0.1,当存储在双精度浮点数中时,实际上近似为 ³??²???????¹???³????????????????? ???(分母为 2 55)。但是,将 0.1 转换为 ¹??? 显然更好,而且¹???将评估为 ³??²?????¹???³?????????????????????? 在浮点运算下。
一个相关的问题是用最少的数字打印十进制浮点数(本文描述了一些技术),这可以被认为是这个问题的一个特殊版本,附加约束是分母必须是 10 的幂。
有一个现有的问题,并且可能更多,但它们没有转换后的有理数必须评估为原始浮点数的约束。