[완료] linux signal 관련
글쓴이: bluesolip / 작성시간: 금, 2014/11/21 - 11:26오전
안녕하세요.
linux signal관련하여 이해가 가지 않는 부분이 있어 도움 부탁드립니다.
만든 코드를 단순화 하면 다음과 같습니다.
main
{
signal(SIGUSR1, signal_handler);
}
static void signal_handler(int sig)
{
printf("Received Signal %d\r\n", sig);
}
linux command창에서 "kill -10 123" (kill -SIGUSR1 PID) 를 전송하면
Received Signal 10이 출력되며 프로세스는 살아있습니다.
문제는 한번더 command를 전송하면 프로세스가 kill되어 버리네요.
혹시 kill 되지 않도록 하는 방법이 있는지요??
제가 잘못 생각한건지 kill을 사용해서 인지 SIGUSR1 를 사용해서 인지를 잘 모르겠어 문의 드립니다.
도움 부탁드립니다.
Forums:
음 ..
시그널 핸들러가 호출되고 나면, 핸들러를 다시 등록해 주어야 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
감사합니다. 바로 해결되었습니다. 추가적으로 설명좀
감사합니다. 바로 해결되었습니다.
추가적으로 설명좀 부탁드려도 될까요?
핸드러를 왜 다시 등록해야하는지와 하지 않으면 왜 process가 죽게 되는지요?
책이나 구글링 해서는 찾을 수가 없었습니다.
음 ..
signal 마다 default action 이 있는데.. (signal(7) 참조)
별 일 없으면 시그널을 전송할 때 default action 이 동작합니다.
10 번이면 SIGBUS 인지 SIGUSR1 인지는 모르겠는데.. 하나는 CORE 고 다른 하나는 TERM 이네요.
하나는 core dump 하면서 죽고, 다른 하나는 그냥 terminated 입니다. 어쨌든 둘 다 죽네요..
signal() 로 핸들러를 등록하면, 저 default action 대신 핸들러가 호출되는데..
한 번 호출되고 나면, 등록된 핸들러는 사라집니다. 다음 시그널에는 default action 이 동작하게 되겠죠.
그래서 보통 핸들러가 종료하기 전에 signal() 을 불러서 핸들러를 다시 등록해 주는 경우가 많습니다.
참고로 SIGKILL 은 uncatchable 입니다. 핸들러로 가로챌 수 없습니다.
그래서 kill -9 로 어떤 프로세스라도 죽일 수 있습니다. 권한만 맞으면..
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
답변 감사드립니다. 큰 도움이 되었습니다..
답변 감사드립니다.
큰 도움이 되었습니다..
답변 감사드립니다. 큰 도움이 되었습니다..
답변 감사드립니다.
큰 도움이 되었습니다..
댓글 달기