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

2022-09-02 22:22:30

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

在cmd中,他们被抓住了,但由于各种限制,我需要以某种方式让他们在Cygwin中工作。

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


答案 1

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

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

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

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


答案 2

这条线索也许可以带来一些启示。一些选项

timeout 1d <command>

Ctrl-C patch by Howard Chu


推荐