我试图在后台编写一个启动OpenOCD的脚本,然后启动并执行连接到我的OpenOCD服务器的GDB实例。除了输入中断字符以停止正在调试的目标,我的OpenOCD服务器就会退出,这主要是可行的。看来OpenOCD正在接收SIGINT。
我试图通过多种不同的方式将OpenOCD从GDB中分离出来,此时我的脚本如下所示:
#! /bin/sh
trap '' SIGINT && nohup sh -c "trap '' SIGINT & openocd -f openocd-jlink.cfg < /dev/null" &
OPENOCD_PID=$!
arm-none-eabi-gdb -ex "set architecture armv6-m" -ex "target extended-remote localhost:2331" obj/main.elf
kill $OPENOCD_PID我非常肯定,这应该是非常过分,但OpenOCD仍然存在,只要我键入中断字符在GDB。如果我直接从shell (而不是脚本的一部分)运行相同的命令,那么一切都按预期的方式工作。即使我只运行openocd -f openocd-jlink.cfg &和GDB,也不需要单独的shell、nohup或捕获SIGINT。
我希望有人知道我可以在我的脚本中做些什么来阻止GDB中的SIGINT到达OpenOCD。也许有什么方法可以完全从shell中去守护?我在这里读过很多关于脚本中关于SIGINT的一般性问题的答案,所以我觉得这可能是OpenOCD和GDB特有的问题。
发布于 2020-01-22 04:04:31
我通过使用setsid成功地解决了这个问题。脚本的工作版本是:
#! /bin/sh
setsid openocd -f openocd-jlink.cfg -l /dev/null &
arm-none-eabi-gdbm" -ex "target extended-remote localhost:2331" obj/main.elf
killall openoc由于我希望脚本在macOS上工作,而Linux和macOS也不附带setsid,所以我最终使用setsid启动了OpenOCD,如下所示:
subprocess.Popen(["openocd", "-f", "openocd-jlink.cfg", "-l", "/dev/null"], preexec_fn = os.setsid)https://stackoverflow.com/questions/59806946
复制相似问题