18

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

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

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

4

2 回答 2

12

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 上得到验证。

于 2013-11-06T19:07:51.420 回答
0

这个线程可能会有所启发。一些选项

timeout 1d <command>

或者

Howard Chu 的Ctrl-C 补丁

于 2013-02-24T08:44:33.767 回答