我有一个独立的应用程序,在该应用程序中,我必须用确认对话框提示用户,以保存他尝试通过关闭系统时所做的更改start-->shutdown
。
我知道通过使用signalhandlers
我们可以做到。
有人可以帮我如何使用信号处理程序吗
2012年5月更新(两年半后)
Trejkaz评论:
在当前版本的Java上,此信号处理代码失败,因为“
INT
”信号“由VM或OS保留”。
此外,当某些东西要求关闭应用程序时,其他有效信号名称实际上都不会触发(我只是经过艰苦的测试,可以发现所有相关的信号…)
关闭钩子大多数情况下都起作用,但是我们发现在这种情况下不会触发,因此下一步显然是求助于在JVM背后注册处理程序
该章“ 积分信号和异常处理中”的“
故障排除指南HotSpot虚拟机 ”提到了“的信号SIGTERM
,SIGINT
,SIGHUP
”只适用于Solaris OS和Linux。
仅提及Windows上的异常处理。
原始答案(2009年9月)
一个ShutdownHook应该能够处理这种情况
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
// what you want to do
}
}));
(附带警告)
另请参阅:
作为简单信号处理的说明:
public class Aaarggh {
public static void main(String[] args) throws Exception {
Signal.handle(new Signal("INT"), new SignalHandler () {
public void handle(Signal sig) {
System.out.println(
"Aaarggh, a user is trying to interrupt me!!");
System.out.println(
"(throw garlic at user, say `shoo, go away')");
}
});
for(int i=0; i<100; i++) {
Thread.sleep(1000);
System.out.print('.');
}
}
}
阻塞信号是保持该信号并推迟发送,直到阻塞解除,但不会丢失。 结构体sigset_t(信号集合) 其中每一位对应系统支持的一种信号。结构体内部是数组。 函数 函数名 描述 [[sigemptyset sigempty]] 初始化信号集为空集 [[sigfillset sigfillset]] 初始化信号集包含全部信号 [[sigaddset sigaddset]] 向信号集中添加信号 [[sigde
Linux常用31个信号(1~31)。signal.h中有个常量NSIG定义了信号的个数,其值通常为为64。 编号 信号 编号 信号 编号 信号 1 SIGHUP 2 SIGINT 3 SIGQUIT 4 SIGILL 5 SIGTRAP 6 SIGABRT 7 SIGBUS 8 SIGFPE 9 SIGKILL 10 SIGUSR1 11 SIGSEGV 12 SIGUSR2 13 SIGPIP
我实现了一个自定义POSIX信号处理程序参考:http://blog.httrack.com/blog/2013/08/23/catching-posix-signals-on-android/ 它们似乎是艺术的平台限制。 通过信号处理程序方法从JNI调用java方法,是否有变通方法或任何其他实现方法。 如果没有,那么是否有替代方案来捕获本机崩溃并传播到应用程序?
问题内容: 我只是在Mac OS X中玩信号。 为什么在我的信号处理程序完成后,以下代码为什么没有产生SIGSEGV的默认行为?在Linux下,代码可以正常工作。 编辑: 我得到的输出如下: 问题是我希望程序在输出之后终止,但是它永远运行了,我不得不中断它。 问题答案: 这实际上使我的大脑冻结了几分钟,而在今天和这个年龄段中永远不使用的原因在我体内变得越来越强大。 首先,从手册页 signal()
信号 信号是一种进程间通信(IPC)机制,主要用于处理异步事件。 不同的Unix衍生版所支持的信号类型并不完全相同。除了支持POSIX规定的信号外,还支持其他信号。 术语解释 术语 解释 生成信号 发生了一个需要引起进程注意的事件而导致信号出现时。也叫发送信号 信号交付 被发送信号的那个进程识别到了信号并采取了适当动作。也叫接收信号 信号句柄 当信号出现时调用进行专门处理的函数。这个函数称为捕获函
有的时候我们希望Go能够智能地处理Unix信号。例如我们希望一个server接收到一个SIGTERM的信号时,能够自动地停止;或者一个命令行工具接收到一个SIGINT信号时,能够停止接收输入。现在我们来看下如何使用channel来处理信号。 package main import "fmt" import "os" import "os/signal" import "syscall" func