signal
시그널은 프로세스에 어떤 event가 발생했을을 알리는 간단한 메시지를 비동기적으로 보내는 것이다. 이 메시지는 어떤 event가 발생했는지를 표시하는 상수 형태이다. 시그널이 발생했을 때 실행되는 동작을 시그널 핸들러라고 하는데, 각각의 시그널은 시그널 핸들러가 미리 정의되어 있으며, 시그널을 받는 프로세스 내에서 시그널 핸들러를 정의할 수도 있다.
프로세스가 실행되고 있는 도중에 [CTRL + C] 키가 입력되면 프로세스가 중단되는데, 이러한 경우가 시그널의 사용한 예이다. [CTRL + C] 키가 입력되면 SIGINT라는 시그널이 발생되는데, SIGINT에 매칭되어 있는 시그널 핸들러가 프로세스를 중단시키는 것이기 때문에 프로세스는 SIGINT가 발생한 즉시 프로세스를 중단시킨다.
시그널 종류
시그널 보내기
1. 터미널에서 kill command를 이용
// test.c
#include <stdio.h>
#include <unistd.h>
int main() {
for (int i=0; i<100; i++) {
printf("%d\n", i);
sleep(1);
}
}
2. 함수 이용 (kill, raise, abort)
#include <sys/types.h>
#include <signal.h>
/* kill: pid로 sig를 시그널로 보내는 함수 */
int kill(pid_t pid, int sig);
/=====================================/
#include <signal.h>
int raise(int sig);
/=====================================/
#include <stdlib.h>
void abort(void);
3. 키보드 입력 (ctrl + c, ctrl + \ ...)
시그널 받기 & 처리
(1) 프로세스가 시그널을 받으면
(2, 3) 즉시 해당 시그널에 맞는 동작을 실행한다. (지정된 시그널 핸들러)
(4) 프로세스는 시그널을 받은 시점 다음 instruction 부터 이어서 동작을 실행한다.
시그널 지정하기
시그널이 발생되면 시그널을 받은 프로세스에서 해당 시그널에 맞는 동작을 실행한다.
시그널을 무시하거나 (핸들러가 SIG_IGN인 경우), 지정된 시그널 핸들러를 실행한다.
후자의 경우 default 정의된 기본동작(SIF_DFL)을 하거나 , 프로세스에서 따로 지정한 핸들러를 실행시키는데,
sinal() 또는 sigaction()을 이용해 특정 시그널에 핸들러를 지정할 수 있다.
(SIGSTOP, SIGKILL 의 경우 핸들러를 지정할 수 없다)
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int sig) {
write(1, "SIGINT\n", 7);
exit(0);
}
int main() {
signal(SIGINT, sig_handler);
pause();
write(1, "after sig_handler()\n", 20);
}
비동기적 시그널 발생
시그널은 비동기적으로 발생할 수 있다. 비동기적이라는 것은 요청을 보냈을 때 응답 상태와 상관없이 다음 동작을 수행할 수 있다는 것이다.
즉, 어떤 시그널이 발생하여 시그널 핸들러가 실행되고 있는 도중에 시그널이 또 발생할 수 있다는 것이다.
시그널 핸들러가 실행되고 있는 도중에 시그널이 발생되면 새로 발생한 시그널은 시그널 큐에서 대기하다가 실행 중인 핸들러의 동작이 끝난 후에 실행된다. 이와 같이 시그널은 발생했으나 아직 전달되지 않은(핸들러가 실행되지 않은) 시그널을 pending signal 이라고 한다.
주의해야 될 점은 특정 타입의 팬딩 시그널은 프로세스 당 항상 하나만 존재할 수 있다. 이미 특정 시그널이 팬딩 중인 상황에서 동일한 시그널이 프로세스에 전달되면, 시그널 큐에서 대기하는 것이 아니라 폐기된다.
예를 들어 특정 시그널의 핸들러가 동작되고 있는 도중에 SIGINT가 3번 발생했다면, SIGINT와 연결된 핸들러는 3번이 아니라 1번만 실행된다. 두 번재 SIGINT 시그널부터는 시그널 큐에서 대기하지 않고 폐기되기 때문이다.
(+) 참고
https://koyo.kr/post/csapp-ecf-signal-1/
'CS > 운영체제' 카테고리의 다른 글
[OS] Synchronization (0) | 2023.04.24 |
---|---|
[OS] CPU Scheduling (0) | 2023.04.24 |
[OS] Thread (0) | 2023.04.20 |
[OS] Process (0) | 2023.04.19 |
[OS] 운영체제의 개념과 구조 (0) | 2023.04.18 |