반응형


이전 포스팅 : 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에서 깨어난다.



다음 포스팅은 신호 집합에 대해서 !!


반응형

'OS > Common' 카테고리의 다른 글

pthread_kill 를 사용하여 컴파일 시 유의사항  (2) 2014.01.24
64비트 컴파일 시 장점  (0) 2014.01.09
Unix/Linux Signal 개념 및 종류  (2) 2013.10.24
유닉스 언어 설정 확인 및 변경  (0) 2013.10.02
Z 확장자 압축해제  (0) 2013.07.09

+ Recent posts