首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么GNU make忽略SIGINT,但不执行以下命令?

为什么GNU make忽略SIGINT,但不执行以下命令?
EN

Stack Overflow用户
提问于 2019-04-23 00:58:35
回答 1查看 240关注 0票数 1

我希望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!'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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并忽略它,以确保它始终运行清理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55798030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档