我维护一个在Windows上运行的C ++构建系统,它由命名组件组成。前一段时间我们从Windows XP升级到Windows 7时,我们注意到构建可能会被取消,Eclipse Cancel按钮只是灰色,但构建总是运行到最后。我们进一步发现,通过使用MSYS而不是MSYS2,构建也可以在Windows 7中取消,但多核构建(例如make -j4)从一开始就挂起(使用MSYS2时)。我们需要多核,因此没有解决方案。
我们做了一些研究并得出结论,MSYS2使用WinAPI进程创建标志CREATE_NEW_PROCESS_GROUP启动make进程。我们假设在Windows XP中没有执行此标志,解释了为什么caneling在那里工作。
我们读到CREATE_NEW_PROCESS_GROUP导致另一个WinAPI调用SetConsoleCtrlHandler(NULL,TRUE),这反过来导致Ctrl-C被禁用,该过程可能只能通过Ctrl-Break终止。我们可以通过从命令行测试我们的构建来验证这种行为。
此问题的预期解决方案是什么?按下取消时是否可以让Eclipse发送Ctrl-Break而不是Ctrl-C?或者我们的MSYS2配置错误,它不应该为构建过程抑制Ctrl-C?或者我们的分析垃圾和问题是完全不同的?