Cygwin CTRL-C(信号中断)无法正常工作 – JVM Shutdown Hooks无法启动

我正在开发一个利用关闭挂钩的Java应用程序,以便清除程序的终止/中断,但我注意到Cygwin的CTRL-C实现似乎没有触发关闭挂钩。 从表面上看,似乎已中断了该过程,将控制权交还给命令行,但是根本不会触发进程的“关闭”挂钩,因此不会发生清理。

在cmd中它们被捕获,但由于各种约束,我需要以某种方式让它们在Cygwin中工作。

有什么方法可以通过Cygwin在正在运行的进程中触发SIGINT,或者可能是我可以用来清理中断和终止的关闭挂钩的替代方法?

Bash通过中间bash进程调用非cygwin(windows)可执行文件(bash shell – > bash – > java)。 键入Ctrl-C时,bash进程获取SIGINT并终止子进程,因此不会调用shutdown挂钩。 Windows进程不知道SIGINT,SIGTERM或SIGKILL等信号。

如-Xrs选项文档中所述,java进程为CTRL_C_EVENT窗口事件注册控制台控制处理程序,并触发调用关闭挂钩的正常终止。 为了让Ctrl-C按预期工作,你需要确保java进程收到它,但是现在它被bash拦截而不是传递给子进程。

此问题可以重述为:我如何让Cygwin将Ctrl-C转发到Windows控制台进程?

注意:上面描述的bash行为已在1.7.25版本上得到validation。

这个话题可能会有所启发。 一些选择

timeout 1d  

要么

Howard Chu的Ctrl-C补丁