프로그램이 동작할 때 Ctrl + c or z같은 키의 조합을 통해서 프로그램을 종료시키는 등
특정 프로그램이 실행되고 있을 때 어떤 신호를 줘서 동작을 멈추거나, 다른 동작을 하게 하는 신호를 시그널이라고 합니다.
시그널의 종류는 다양하며 각 시그널마다 정의된 상수가 있습니다.
시그널의 목록을 확인하고 싶다면 kill -l
을 통해서 확인할 수 있고 아래와 같습니다.
1) SIGHUP | 2) SIGINT | 3) SIGQUIT | 4) SIGILL |
5) SIGTRAP | 6) SIGABRT | 7) SIGEMT | 8) SIGFPE |
9) SIGKILL | 10) SIGBUS | 11) SIGSEGV | 12) SIGSYS |
13) SIGPIPE | 14) SIGALRM | 15) SIGTERM | 16) SIGURG |
17) SIGSTOP | 18) SIGTSTP | 19) SIGCONT | 20) SIGCHLD |
21) SIGTTIN | 22) SIGTTOU | 23) SIGIO | 24) SIGXCPU |
25) SIGXFSZ | 26) SIGVTALRM | 27) SIGPROF | 28) SIGWINCH |
29) SIGINFO | 30) SIGUSR1 | 31) SIGUSR2 |
프로세스는 시그널을 받으면 다음과 같은 동작을 하게 됩니다.
시그널은 시그널 함수를 통해서 전달됩니다.
시그널 함수들은 signal.h
에 정의되어 있고 각각 아래와 같은 동작을 합니다.
pid > 0 인 경우에는 pid로 지정한 프로세스에게 시그널을 보냅니다.
kill 함수의 전송속도는 signal함수가 시그널을 받는 속도보다 빠릅니다.
그렇기 때문에 kill함수를 연속으로 사용하실때 지연시간을 두시는걸 추천합니다.
매개변수 | 뜻 |
---|---|
pid | 시그널을 보낼 프로세스의 PID |
pid == 양수 | 지정한 프로세스에 시그널 전달 |
pid == 0 | 함수를 호출하는 프로세스의 그룹 전체에 전달 |
pid == -1 | 함수를 호출하는 프로세스가 갖고있는 권한에 따라 가능한 프로세스 모두에게 전달 |
pid == -1 이외의 음수 | 첫번째 인수 pid의 절댓값 프로세스 그룹에 속한 모든 프로세스에게 전달 |
sig | 보낼 시그널의 정보 |
raise는 이 함수를 호출한 프로세스에게 인자로 지정한 시그널(sig)를 보냅니다.
signal handler가 호출되면 signal handler의 수행이 끝날 때 까지 raise 함수는 리턴하지 않습니다.
매개변수 | 뜻 |
---|---|
sig | 보낼 시그널의 정보 |
받아온 시그널을 해당 함수포인터에서 동작하게 만들어 줍니다.
예를 들어서 Ctrl + C가 들어오면 원래 종료가 되어야 하는데 매개변수로 들어온 핸들러로 들어가서 해당 함수에 정의해놓은 동작을 하게 됩니다.
그리고 이전에 설정되어있는 시그널핸들러(이전에 정의된 함수)를 리턴합니다.
매개변수 | 뜻 |
---|---|
signum | 보낼 시그널의 정보 |
void (*handler)(int) | 동작을 정의해놓은 함수 |
참고