Unix/Linux Signal 처리 방식 및 관련 함수들 설명1
이전 포스팅 : http://jangpd007.tistory.com/entry/Unix-Signal-%EC%A2%85%EB%A5%98
이전에 Signal의 전체적인 개념에 대해 잡았다면 이번에는 Signal 처리 방식에 대해 알아보자
Signal 처리 함수의 가장 기본적인 방식은 Siganl 함수를 이용해서 핸들러를 등록한 뒤 해당 Signal에 대해 Catch 된 이 후를 명시하는 방법이다.
Signal 함수의 기본 원형이다.
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
Return 값 : 성공시 이전 Signal handler, 오류시 SIG_ERR
signal 함수의 두번째 인수로 주어진 값에 따라 수행여부가 결정되는데 입력 방식은 아래와 같다.
1. signal handler 함수 : 해당 Signal 을 catch 하여 handler 함수명을 지정
2. SIG_IGN : 해당 Signal은 무시(ignore)
3. SIG_DFL : 해당 Signal의 default action을 수행한다.
주의 사항은 SIGKILL(9), SIGSTOP(시스템에 따라 다름)는 시그널 핸들러를 사용자가 임의로 지정할 수 없으며 해당 Signal은 무시할 수도 없다.
즉 signal 함수로 두가지 SIGNAL은 catch or ignore 할 수 없습니다.
또한 해당 Signal들에 대해 핸들러를 등록할 때 컴파일 및 런타임 에러가 발생하지는 않습니다.
단지 기본동작(SIGKILL-Terminate, SIGSTOP-Stop Process)으로만 동작할 뿐입니다.
#include<signal.h> #include<unistd.h> void sig_handler_usr1(int signo) { printf("catched sigusr1\n"); } int main() { if(signal(SIGUSR1, sig_handler_usr1) == SIG_ERR) { perror("SIGUSR1 ERROR"); } while(1) sleep(1); return 1; }
#include<signal.h> #include<sys/types.h int kill(pid_t pid, int sig); int raise(int sig);Return 값 : 성공시 0, 오류시 -1
함수 kill은 주어진 process에게 signal을 보낸다.
하지만 raise는 자신의 process에게 signal을 보낸다.
#include<unistd.h> unsigned int alarm(unsigned int seconds);Return 값 : 성공시 이전 alarm이 없을 경우 0, 있을 경우 이전 alarm의 남은 second 수
함수 alarm은 주어진 시간이 지난 후에 SIGALRM이 자신의 process에게 전달되게 한다.
#include<unistd.h> int pause(void);Return 값 : -1, errno은 EINTR.
함수pause는 signal이 deliver될 때 까지 sleep한다.
#include<stdlib.h> void abort(void);Return 값 : void
함수 abort는 자신의 process에게 SIGABRT을 보낸다.
process는 SIGABRT를 받으면 프로세스는 abnormal termination을 한다.
#include<unistd.h> unsigned int sleep(unsigned int seconds);Return 값 : 0 혹은 신호를 받은 경우 남은 sleep 시간(초)
함수 sleep은 주어진 시간(초) 동안 프로세스의 수행을 중단시킨다. 만약 sleep 도중 신호가 전달되면 sleep에서 깨어난다.
다음 포스팅은 신호 집합에 대해서 !!