'시그널'에 해당되는 글 2

  1. 2011.01.27 시그널 처리 테스트 코드 작성
  2. 2011.01.25 Java 에서 시그널 처리하기(Windows)

시그널 처리 테스트 코드 작성

public class SignalTest {

	private Signal receivedSignal;
	private Signal signal;
	
	private SignalHandler signalHandler = new SignalHandler() {
		@Override
		public void handle(Signal signal) {
			receivedSignal = signal;
		}
	};

	@Before
	public void setUp(){
		receivedSignal = null;
		signal = null;
	}
	
	@Test
	public void testRaise() throws InterruptedException{
		signal = new Signal("TERM");
		Signal.handle(signal, signalHandler);      
		Signal.raise(signal);
		Thread.sleep(1);
		assertEquals(signal.getName(), receivedSignal.getName());
	}
	
	@Test(expected=IllegalArgumentException.class)
	public void testBREAK(){
		signal = new Signal("BREAK"); 
		Signal.handle(signal, signalHandler); //Signal already used by VM: SIGBREAK
	}

	@Test(expected=IllegalArgumentException.class)
	public void testQUIT(){
		signal = new Signal("QUIT"); //Unknown signal: QUIT
	}
}
- 인터럽트 거는 부분은 어떻게 작성해야 하나?

- 테스트를 작성하면서 알아낸 사실
testRaise() 에서 시그널을 발생시켜도 바로 전달되지 않는다는 것을 알게 되었다.
sleep 을 하지 않으면 테스트가 실패할 경우도 생긴다.

테스트 작성의 순기능인가...ㅎㅎ

Java 에서 시그널 처리하기(Windows)

Windows 환경에서는 제약사항이 있다.
import sun.misc.Signal;
import sun.misc.SignalHandler;


public class SignalHandlerImpl {

	public static void main(String[] args) throws InterruptedException {
		
		System.out.println("start");
		
		SignalHandler signalHandler = new SignalHandler() {			
			@Override
			public void handle(Signal signal) {
				System.out.println("signal.name : " + signal.getName() 
					+ ", signal.number : " + signal.getNumber());
			}
		};
		Signal.handle(new Signal("INT"), signalHandler); //Ctrl-C
		Signal.handle(new Signal("TERM"), signalHandler);		
		Signal.raise(new Signal("TERM"));
		
		Thread.sleep(1000 * 60);
		System.out.println("end");
		
	}
}

> java SignalHandlerImpl
start
signal.name : TERM, signal.number : 15 //Signal.raise() 로 발생시킴.
Ctrl - C
signal.name : INT, signal.number : 2

end

- TERM, ABRT, ILL, SEGV 는 Windows 운영체제에서 발생되지 않는다.

- BREAK, FPE 도 사용할 수 없다.
Signal already used by VM: SIGBREAK

- QUIT 도 사용할 수 없다.
Unknown signal: QUIT

- MSDN signal