我希望make执行第92行(killall)上的命令,即使第91行(gdb)上的前一个命令已使用SIGINT (由Ctrl+C)停止:
88 debug:
89 make all
90 make flash
91 -$(GDB) $(PROJ_NAME).elf $(GDBCOMMANDS)
92 killall openocd
然而,即使make打印有关忽略中断的信息,它仍然不会在之后运行killall:
make: [Makefile:91: debug] Interrupt (ignored)
当我在没有执行SIGINT - killall的情况下退出GDB时,一切都能正常工作。
在上面的场景中,为什么make不尝试执行killall?我该如何让它工作呢?
你可以用这个Makefile自己测试这个问题(如果你在退出前在man窗口中按CTRL+C,echo将不会被执行,但如果你只需按‘q’退出,它就会被执行):
all:
-man man
echo 'It worked!'
发布于 2019-04-23 03:16:24
问题是^C也被make捕获(当您运行^C时,终端的进程组中的所有进程都接收到信号),make正在退出(在清理之后),因此它永远不会再尝试运行任何命令,就像您在make进程中输入^C一样。
避免这种情况的唯一方法是确保make根本不接收SIGINT,唯一的方法是更改进程组。我不确定是否有什么方便的工具可以帮你做到这一点。
我的建议是不要试图从make菜谱中调用调试器或其他交互式程序。它不是为此而设计的。除了上述问题之外,您还会发现,如果您尝试在启用并行构建的情况下运行,由于只有一个进程可以从终端获取stdin,因此将随机选择一个进程来获取“真正的”stdin,而其他进程将关闭它们的stdin或从/dev/null或其他地方读取它们的stdin。
相反,为什么不创建一个shell脚本来进行调试,它将运行您想要的make命令,然后调用gdb。这个外壳脚本可以使用trap
来捕获SIGINT并忽略它,以确保它始终运行清理。
https://stackoverflow.com/questions/55798030
复制相似问题