在Console下,用户按下Ctrl+C后,进程就会收到相应的中断信号(Signal). 然后,该进程就会作手处理(或默认不处理)。
下面,看看Java中怎么处理用户按下Ctrl+C(linux下 kill -15 pid也可).
public static void hookBySignal(){
SignalHandler handler = new SignalHandler(){
public void handle(Signal sig) {
System.out.println("hooking shutdown signal");
} };
Signal.handle(new Signal("INT"),handler);
//hook ctrl+c
Signal.handle(new Signal("TERM"),handler);
//hook alt+f4
}
备注: 上面是引用sun.misc Package下的Class,非Sun的JVM,可能就不适用。
再来看看
Jetty 是怎么处理这类的?
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/**
* ShutdownHook thread for stopping all servers.
*
* Thread is hooked first time list of servers is changed.
*/
private static class ShutdownHookThread extends Thread
{
private boolean hooked = false;
private ArrayList servers = new ArrayList();
/**
* Hooks this thread for shutdown.
*
* @see java.lang.Runtime#addShutdownHook(java.lang.Thread)
*/
private void createShutdownHook()
{
if (!Boolean.getBoolean("JETTY_NO_SHUTDOWN_HOOK") && !hooked)
{
try
{
Method shutdownHook = java.lang.Runtime.class.getMethod("addShutdownHook", new Class[]
{ java.lang.Thread.class});
shutdownHook.invoke(Runtime.getRuntime(), new Object[]
{ this});
this.hooked = true;
}
catch (Exception e)
{
if (Log.isDebugEnabled())
Log.debug("No shutdown hook in JVM ", e);
}
}
}
/**
* Add Server to servers list.
*/
public boolean add(Server server)
{
createShutdownHook();
return this.servers.add(server);
}
/**
* Contains Server in servers list?
*/
public boolean contains(Server server)
{
return this.servers.contains(server);
}
/**
* Append all Servers from Collection
*/
public boolean addAll(Collection c)
{
createShutdownHook();
return this.servers.addAll(c);
}
/**
* Clear list of Servers.
*/
public void clear()
{
createShutdownHook();
this.servers.clear();
}
/**
* Remove Server from list.
*/
public boolean remove(Server server)
{
createShutdownHook();
return this.servers.remove(server);
}
/**
* Remove all Servers in Collection from list.
*/
public boolean removeAll(Collection c)
{
createShutdownHook();
return this.servers.removeAll(c);
}
/**
* Stop all Servers in list.
*/
public void run()
{
setName("Shutdown");
Log.info("Shutdown hook executing");
Iterator it = servers.iterator();
while (it.hasNext())
{
Server svr = (Server) it.next();
if (svr == null)
continue;
try
{
svr.stop();
}
catch (Exception e)
{
Log.warn(e);
}
Log.info("Shutdown hook complete");
// Try to avoid JVM crash
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
Log.warn(e);
}
}
}
}
注意到他为什么要使用反射,而不直接使用java.lang.Runtime.addShutdownHook ?
仔细想一下,应该主要是考虑到jdk版本兼容问题(低版本1.2.2下不被支持)。
再贴上java.lang.Runtime#addShutdownHook的注释
分享到:
相关推荐
当用户按下Ctrl+C时,`获取控制台输入`函数会返回3(Ctrl+C的ASCII码),程序就会捕获到这个事件并执行相应的退出操作。如果没有按下Ctrl+C,程序则会打印出用户输入的字符。 通过这种方式,易语言初学者可以学习...
qt的键盘事件不能捕获多个按键按...即便是在使用modifiers()时,也只能获得类似于shfit+x,ctrl+c,alt+y等等之类的快捷键,对于shift+x+c诸如此类更多的组合就无能为力的.本案例中提供了一种捕获shift+a+b...组合键的方法
在这个特定的场景中,我们关注的是“易语言控制台Ctrl+C源码”,这通常指的是在易语言环境下,如何捕获并响应用户在控制台按下Ctrl+C这一键盘组合键的程序代码。 在大多数编程环境中,Ctrl+C是一个常用的中断信号,...
电脑快捷键是用于简化操作、提高效率的一系列按键组合。它们广泛应用于操作系统、浏览器、文本编辑器和其他软件中,使用户能够不使用鼠标,仅通过键盘快速执行常用命令。 F5: 通常用于刷新或更新当前窗口的内容。在...
* 退出飞行模拟:CTRL + C * 立即退出飞行模拟:CTRL + BREAK 飞机控制面指令(CONTROL SURFACE COMMANDS) * 副翼左倾斜:数字键盘 4 * 副翼右倾斜:数字键盘 6 * 副翼左配平:CTRL + 数字键盘 4 * 副翼右配平:...
通过捕获Ctrl + Shift + C的按键组合,我们可以防止默认行为的发生,即不打开开发者工具。然后,扩展程序会利用`document.execCommand('copy')`命令将当前选中的内容复制到剪贴板,实现了预期的复制功能。 在实现这...
3. **复制**: `Ctrl + C` - 复制选中的文本或元素。 4. **剪切**: `Ctrl + X` - 剪切选中的文本或元素。 5. **粘贴**: `Ctrl + V` - 将剪贴板中的内容粘贴到当前位置。 6. **撤销**: `Ctrl + Z` - 撤销上一步操作。 ...
5. **信号**:信号是进程间通信的一种方式,用于通知进程发生了某些事件,如SIGINT(中断)用于捕获用户按键Ctrl+C,SIGTERM(终止)用于请求程序优雅退出。 6. **线程**:多线程编程在UNIX环境中通常通过pthread库...
- **CTRL + C**: 复制所选内容。 - **CTRL + X**: 剪切所选内容。 - **CTRL + V**: 粘贴剪贴板中的内容。 - **CTRL + Z**: 撤销上一步操作。 - **CTRL + O**: 打开文件对话框,用于选择并打开文件。 - **SHIFT + ...
- Ctrl + C:复制选中的项目。 - Ctrl + V:粘贴复制的项目。 - Ctrl + X:剪切选中的项目。 - Ctrl + Z:撤销操作。 - Ctrl + S:保存当前工作。 - Ctrl + O:打开文件。 - Ctrl + F:打开搜索框。 - Ctrl + P:...
- `Ctrl + C`:复制选中的文本或对象。 - `Ctrl + V`:粘贴已复制的文本或对象。 - `Ctrl + Z`:撤销上一步操作。 - `Ctrl + A`:全选当前文档中的内容。 4. **文本编辑**: - `Ctrl + B`:加粗文字。 - `...
- **Ctrl + C / Ctrl + X / Ctrl + V**:分别用于复制、剪切和粘贴所选内容。 - **Ctrl + Z**:撤销上一步操作,对于误操作后的恢复至关重要。 - **Ctrl + O**:打开文件,是编辑软件中常见的快捷键。 - **Ctrl + S*...
- **CTRL + C**: 复制选中的文本或对象。 - **CTRL + X**: 剪切选中的文本或对象。 - **CTRL + V**: 粘贴复制或剪切的内容。 - **CTRL + Z**: 撤销最近的操作。 - **CTRL + O**: 打开文件或项目。 - **CTRL + F4**: ...
在录制过程中,执行特定的操作,例如:在表格中使用Ctrl+C复制关键词,这将被按键精灵捕获并添加到脚本中。接着,导航到Excel,通过点击下拉菜单中的三角形,选择相应的选项,这个过程也会被记录。 然后,我们使用...
#### 剪切、复制与粘贴:Ctrl+C, Ctrl+X, Ctrl+V - **Ctrl+C**:用于复制选定的内容。无论是文本、图片还是文件,只需选中目标,按下此组合键即可快速复制。 - **Ctrl+X**:执行剪切操作,即将选定的内容从原位置...
对话框(Dialog Box)是用户界面的重要组成部分,它提供了一种与用户交互的方式,而组合按键(Combination Keys)如Ctrl+C、Ctrl+V等则是提高用户效率的快捷方式。在这个“对话框程序响应组合按键”的项目中,我们将...
- Ctrl+C:复制选定项。 - Ctrl+V:粘贴剪切或复制的内容。 3. Alt键快捷键: - Alt+F4:关闭当前程序。 - Alt+Tab:切换到下一个打开的应用程序。 - Alt+Esc:按程序打开顺序循环切换窗口。 - Alt+F:打开...
按键替换器的工作就是捕获这些原始的按键信号,然后根据用户预设的规则,将特定的按键映射为其他按键或组合,从而改变原本的输入行为。例如,你可以设置将“A”键替换为“B”键,或者将“Ctrl+C”快捷键替换为“Ctrl...
例如,Ctrl+C用于复制,Ctrl+V用于粘贴。在易语言中,开始输入热键的函数允许程序员注册一个热键,当用户按下设定的组合键时,程序会接收到相应的信号并执行相应的代码。 “键盘钩子回调”是另一种重要的技术,它...
4. **Ctrl+V**:粘贴剪贴板上的内容到当前位置,通常与Ctrl+C或Ctrl+X配合使用。 5. **Ctrl+Z**:撤销上一步操作,这是非常实用的功能,可以快速恢复因误操作而修改的内容。 6. **Ctrl+A**:全选当前窗口中的所有...