Cygwin CTRL-C(信号中断)无法正常工作 - JVM 关闭挂钩未启动

2024-06-23

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

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

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


Bash 通过中间 bash 进程(bash shell -> bash -> java)调用非 cygwin (windows) 可执行文件。当您键入 Ctrl-C 时,bash 进程会收到 SIGINT 并杀死子 java 进程,因此不会调用关闭挂钩。 Windows 进程不知道 SIGINT、SIGTERM 或 SIGKILL 等信号。

如中所述-Xrs http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html根据选项文档,java 进程为 CTRL_C_EVENT windows 事件注册一个控制台控制处理程序,并触发调用关闭挂钩的正常终止。为了让 Ctrl-C 按预期工作,您需要确保 java 进程接收到它,但现在它被 bash 拦截并且不会转发到子进程。

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

注意:上述 bash 行为已在版本 1.7.25 上得到验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cygwin CTRL-C(信号中断)无法正常工作 - JVM 关闭挂钩未启动 的相关文章

随机推荐