시그널이란?

개발하는 곰댕이·2021년 6월 11일
0

OS

목록 보기
5/5
post-custom-banner

1. 시그널이란?

프로그램이 동작할 때 Ctrl + c or z같은 키의 조합을 통해서 프로그램을 종료시키는 등
특정 프로그램이 실행되고 있을 때 어떤 신호를 줘서 동작을 멈추거나, 다른 동작을 하게 하는 신호를 시그널이라고 합니다.

1.1 시그널 목록

시그널의 종류는 다양하며 각 시그널마다 정의된 상수가 있습니다.
시그널의 목록을 확인하고 싶다면 kill -l을 통해서 확인할 수 있고 아래와 같습니다.

1) SIGHUP2) SIGINT3) SIGQUIT4) SIGILL
5) SIGTRAP6) SIGABRT7) SIGEMT8) SIGFPE
9) SIGKILL10) SIGBUS11) SIGSEGV12) SIGSYS
13) SIGPIPE14) SIGALRM15) SIGTERM16) SIGURG
17) SIGSTOP18) SIGTSTP19) SIGCONT20) SIGCHLD
21) SIGTTIN22) SIGTTOU23) SIGIO24) SIGXCPU
25) SIGXFSZ26) SIGVTALRM27) SIGPROF28) SIGWINCH
29) SIGINFO30) SIGUSR131) SIGUSR2

1.2 프로세스와 시그널

프로세스는 시그널을 받으면 다음과 같은 동작을 하게 됩니다.

  • 시그널에 해당되는 동작
  • 시그널 무시
  • 사용자가 정의한 함수를 통해서 동작을 바꿈

1.3 시그널의 특징

  • 비신뢰성
    시그널을 보내면 그 시그널이 잘 도착했는지 확인하지 않습니다. 그렇기 때문에 신뢰성이 낮습니다.
  • 대기하지 않습니다.
    시그널을 받아서 해당 시그널의 동작을 처리하고 있는데 새로운 시그널이 넘어오면 해당 시그널은 무시하게 됩니다.

2. 시그널 함수

시그널은 시그널 함수를 통해서 전달됩니다.
시그널 함수들은 signal.h에 정의되어 있고 각각 아래와 같은 동작을 합니다.

int kill(pid_t pid, int sig)

pid > 0 인 경우에는 pid로 지정한 프로세스에게 시그널을 보냅니다.

kill 함수의 전송속도는 signal함수가 시그널을 받는 속도보다 빠릅니다.
그렇기 때문에 kill함수를 연속으로 사용하실때 지연시간을 두시는걸 추천합니다.

매개변수
pid시그널을 보낼 프로세스의 PID
pid == 양수지정한 프로세스에 시그널 전달
pid == 0함수를 호출하는 프로세스의 그룹 전체에 전달
pid == -1함수를 호출하는 프로세스가 갖고있는 권한에 따라 가능한 프로세스 모두에게 전달
pid == -1 이외의 음수첫번째 인수 pid의 절댓값 프로세스 그룹에 속한 모든 프로세스에게 전달
sig보낼 시그널의 정보

int raise(int sig)

raise는 이 함수를 호출한 프로세스에게 인자로 지정한 시그널(sig)를 보냅니다.
signal handler가 호출되면 signal handler의 수행이 끝날 때 까지 raise 함수는 리턴하지 않습니다.

매개변수
sig보낼 시그널의 정보

void (*)(int) signal(signum, void (*handler)(int))

받아온 시그널을 해당 함수포인터에서 동작하게 만들어 줍니다.
예를 들어서 Ctrl + C가 들어오면 원래 종료가 되어야 하는데 매개변수로 들어온 핸들러로 들어가서 해당 함수에 정의해놓은 동작을 하게 됩니다.
그리고 이전에 설정되어있는 시그널핸들러(이전에 정의된 함수)를 리턴합니다.

매개변수
signum보낼 시그널의 정보
void (*handler)(int)동작을 정의해놓은 함수

참고

post-custom-banner

0개의 댓글