鉴于此hack.c程序:
#include <stdio.h>
main()
{
int i=0;
for(i=0; i<100; i++) {
printf("%d\n", i);
sleep(5);
}
}
Run Code Online (Sandbox Code Playgroud)
和这个hack.sh bash脚本:
#!/bin/bash
./hack
Run Code Online (Sandbox Code Playgroud)
如果我运行hack.sh,则会创建两个进程 - 一个用于bash,一个用于C任务.如果TERM信号被发送到bash进程,则C进程不受伤害.
现在,假设原始bash是使用Runtime.exec()从Java程序启动的,所以我对它的唯一控制是Process.destroy()(它将TERM发送到bash进程)?假设我希望 C进程与启动它的bash一起死掉?
我一直在用bash尝试这样的事情:
#!/bin/bash
trap "kill -TERM -$$; exit" TERM
./hack
Run Code Online (Sandbox Code Playgroud)
即一个陷阱子句,它捕获TERM信号并将其重新广播到整个进程组.这对我不起作用 - 其中包含该陷阱子句的bash进程忽略了 TERM信号.
我在这里错过了什么?
运行以下代码段:
#!/bin/bash
function preexec ()
{
echo -e "\n-->preexec command: $BASH_COMMAND"
}
trap 'preexec' DEBUG
function testfunc ()
{
echo "testfunc called $1"
}
testfunc "main"
source "source.sh"
exit 0
Run Code Online (Sandbox Code Playgroud)
其中source.sh是
#!/bin/bash
testfunc "source"
Run Code Online (Sandbox Code Playgroud)
得到:
-->preexec command: testfunc "main"
testfunc called main
-->preexec command: source "source.sh"
testfunc called source
-->preexec command: exit 0
Run Code Online (Sandbox Code Playgroud)
这意味着源文件中的每个命令都不会被DEBUG陷阱捕获.
事实上,如果我添加该行
trap 'preexec' DEBUG
Run Code Online (Sandbox Code Playgroud)
在source.sh内部作为第二行,一切都按照需要工作(源文件中的命令也被捕获).
如何将此作为默认行为,以避免为我需要提供的任何文件重复上述行?换句话说:有没有机会告诉源文件继承DEBUG陷阱?
我正在尝试使用AFSK和微控制器实现音频插孔数据接口.
通过搜索,我看到了一些使用iPhone的实现,例如:http: //www.creativedistraction.com/demos/sensor-data-to-iphone-through-the-headphone-jack-using-arduino/comment -page-1 /#评论-243826
在那里他们使用了"Perceptive Development的SerialModem for iPhone",虽然它似乎包含一个hex文件和一个电路原理图?
通过搜索"AFSK Android库","FSK安卓库"或其他各种组合,我找不到任何东西.有没有人知道这些Android工具的良好来源?
或者,是否有一个库可以实现可用于解调数据的简化FFT?当然,你不想做一个完整的FFT,因为你只是想区分(从这里得到的想法:http://labs.perceptdev.com/how-to-talk-to-tin-can/)但是我确定有类似的东西
我查看了spandsp,http://www.soft-switch.org/,寻找更通用的DSP库.不确定这些是否可以在Android上使用.
谢谢你的帮助
我想在我的Bash脚本中进行清理操作,如下所示:
#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR
true
false
Run Code Online (Sandbox Code Playgroud)
使用$?
脑海作为一种自然选择,但事实并非如此.它总是包含0
.有什么方法可以"窥探" ERR
陷阱中的exitcode 吗?
[更新:]我不知道我之前测试过的是什么.这段代码就像一个魅力,所以我把它留在这里作为一个小而好的例子.
我试图将 stdout 和 stderr 中的所有内容记录到日志文件中,并仍然保留控制台。为此,我只是将:附加|& tee -a log_file.log
到每个命令中。
但是,如果脚本期间发生任何错误,我还想运行自定义命令。为此,我在脚本的开头添加了以下内容:trap "echo Non-zero exit code detected" ERR
。
问题是通过使用管道运算符,陷阱中的回显不再执行。
脚本 1,不带管道:
$cat test.sh
#!/bin/bash
trap "echo Non-zero exit code detected!" ERR
function fail_please()
{
echo "Returning non-zero exit code!"
return 1
}
fail_please
Run Code Online (Sandbox Code Playgroud)
输出1:
$ ./test.sh
Returning non-zero exit code!
Non-zero exit code detected!
Run Code Online (Sandbox Code Playgroud)
脚本 2,带管道:
$ cat test.sh
#!/bin/bash
trap "echo Non-zero exit code detected!" ERR
function fail_please()
{
echo "Returning non-zero exit code!"
return 1
}
fail_please …
Run Code Online (Sandbox Code Playgroud) 有没有办法检查trap
Bash中已设置的内容(在当前会话或脚本中)?
理想情况下,我希望能够获得trap
分配给它们的信号列表,但如果不可能,我可以单独检查每个信号.
我正在拼命寻找从PHP生成SNMP陷阱的方法.我知道使用snmpget的方法的构建,但我无法弄清楚如何发送SNMP陷阱.
有人知道它的类/代码片段吗?除了使用exec调用cli工具之外,搜索网络并没有提出任何其他内容,这对我来说绝对没有选择.
我怀疑使用socket_create和相应的功能来手动生成UDP包是必要的...
如果带有EXIT陷阱的Bash脚本中出现语法错误,是否可以将退出代码传播给调用者?例如,如果我有:
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
Run Code Online (Sandbox Code Playgroud)
然后,即使脚本没有真正成功结束,运行它也会提供退出代码0:
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
但是如果我注释掉退出陷阱,则脚本返回1.或者,如果我使用返回非零(例如/bin/false
)的命令替换带有未绑定变量的行,则该退出值将按照我希望的方式传播.
客户报告我们的一个程序由于除零而导致错误.我们只有这个VLM系列:
kernel: myprog[16122] trap divide error rip:79dd99 rsp:2b6d2ea40450 error:0
Run Code Online (Sandbox Code Playgroud)
我不相信有核心文件.
我通过互联网搜索了一下,我怎么能告诉导致这种除法的程序行为零,但到目前为止,我失败了.
我知道16122是程序的pid,所以这对我没有帮助.
我怀疑rsp:2b6d2ea40450与导致错误的行的地址(0x2b6d2ea40450)有关但是这是真的吗?
如果是,那么我怎样才能将它转换为源中的物理大致位置,假设我可以将myprog的调试版本加载到gdb中,然后请求显示该地址周围的上下文...
任何,任何帮助将不胜感激!