JVM signal 처리 샘플
JVM signal을 처리하는 프로그램을 공유합니다.
Linux, HP-UX, Windows 등 운영체제마다 시그널을 처리하는 방식이 차이가 있습니다. 참고하시구요. 아래 프로그램은 윈도우 기반으로 짜여진 프로그램입니다.
1. OS별 처리 가능한 Signal
2. Signal 핸들링하는 소스
- 아래 프로그램은 TERM, INT, ABRT을 처리하는 예임
3. 실행 결과
- 아래프로그램을 실행한 다음 Ctr-C 누름, SIGINT signal이 호출됨.
Linux, HP-UX, Windows 등 운영체제마다 시그널을 처리하는 방식이 차이가 있습니다. 참고하시구요. 아래 프로그램은 윈도우 기반으로 짜여진 프로그램입니다.
1. OS별 처리 가능한 Signal
- Unix/Linux : SEGV, ILL, FPE, BUS, SYS, CPU, FSZ, ABRT, INT, TERM, HUP, USR1, QUIT, BREAK, TRAP, PIPE
- Windows : SEGV, ILL, FPE, ABRT, INT, TERM, BREAK
2. Signal 핸들링하는 소스
- 아래 프로그램은 TERM, INT, ABRT을 처리하는 예임
package client;
import java.util.HashMap;
import java.util.Map;
import sun.misc.Signal;
import sun.misc.SignalHandler;
public class DaemonSignalHandler implements SignalHandler
{
private static Map<Signal, SignalHandler> handlers
= new HashMap<Signal, SignalHandler>();
public void handle(Signal signal)
{
try {
System.out.println("received " + signal);
handlers.get(signal).handle(signal);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void delegateHandler(final String signalName,
final SignalHandler signalHandler)
{
Signal signal = null;
SignalHandler oldhandler = null;
try {
signal = new Signal(signalName);
oldhandler = Signal.handle(signal, signalHandler);
} catch (Exception e) {
e.printStackTrace();
} finally {
handlers.put(signal, oldhandler);
}
}
public static void main(String[] args)
{
final int LONG_TIME = 50000;
try {
SignalHandler example = new DaemonSignalHandler();
delegateHandler("TERM", example);
delegateHandler("INT", example);
delegateHandler("ABRT", example);
Thread.sleep(LONG_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3. 실행 결과
- 아래프로그램을 실행한 다음 Ctr-C 누름, SIGINT signal이 호출됨.
java -cp . client.DaemonSignalHandler
received SIGINT








