我正在维护一个在 Windows 上运行并由命名组件组成的 C++ 构建系统。当我们前段时间从 Windows XP 升级到 Windows 7 时,我们注意到可以再取消构建,Eclipse 取消按钮只是变灰,但构建总是运行到最后。我们进一步发现,通过使用 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?还是我们的分析垃圾和问题完全不同?