치춘짱베리굿나이스
[Rank 2 / 3] Minitalk / Minishell - 시그널이란 본문
signal이란?
프로그램 구동 중에 Interrupt가 발생했을 때, 프로세스에 어떠한 Interrupt가 발생했음을 알리는 간단한 메시지를 전송하는 것
signal을 받은 프로세스는 해당 시그널이 무엇인지에 따라 지정된 기본 동작을 수행하거나, 사용자가 정의한 함수에 의해 무시하거나, 또는 사용자 정의 함수를 통해 특별한 처리를 해 줄 수 있다
예시
프로세스 동작 중에 ctrl + c를 누르면 프로세스가 종료 (kill
) 되는 현상도 Signal이 발생하였다고 볼 수 있다
Signal 함수 종류
<signal.h>
헤더에 기본적인 동작들과 signal 관련 함수들이 정의되어 있음
기본적으로 정의된 동작은 주로 프로세스를 종료하거나, 코어 덤프를 생성
Kill
int kill(pid_t pid, int sig);
raise
int raise(int sig);
- 현재 스레드 (이 함수를 호출한 프로세스) 에 sig 시그널을 보낸다
sig
에 보낼 시그널 번호가 들어간다- 정상적으로 시그널이 전송되었을 경우 0이 리턴되고, 그 외의 경우에는 -1 리턴 및 errno 세팅됨
abort
void abort(void);
- 현재 스레드 (이 함수를 호출한 프로세스) 에 SIGABRT 시그널을 보낸다
- SIGABRT 시그널은 프로세스를 비정상적으로 종료시키고 코어 덤프 파일을 생성한다
- 보낼 프로세스 pid나 시그널 넘버같은것도 정의할 필요가 없기 때문에 인자값도 없다
- 모든 열려있는 스트림은 flush된 후 닫힘
sigsend
int sigsend(idtype_t idtype, id_t id, int sig);
- sig 시그널을 id로 지정한 특정 프로세스나 프로세스 그룹에 전송한다
sig
에 보낼 시그널 번호가 들어간다idtype
에 id의 종류가 (프로세스 or 프로세스 그룹),id
에 프로세스 또는 프로세스 그룹의 id가 들어간다
⌘ 스트림 (Stream)
데이터 입출력 시 임시적으로 정보들이 기록되는 곳
입출력은 스트림으로부터 데이터를 읽거나 출력되는 방식으로 이루어진다
스트림이 있는 덕분에 입출력 장치를 어느 걸 사용하든 상관이 없음
텍스트 스트림은 텍스트만을 다루고, 바이너리 스트림은 모든 자료를 바이트 단위로 처리하기 때문에 모든 종류의 데이터 (ex: 파일 입출력 등) 를 다룰 수 있다
⌘ 코어 덤프란?
프로그램이 비정상적으로 종료되었을 때 (Segmentation fault (core dumped) 라는 에러문구를 한 번쯤 본 적이 있을 것이다...) 해당 시점의 램 내부 메모리 상태를 기록으로 남기면서 죽는다
이때 남겨진 기록이 바로 코어 덤프 (램에 대한 스냅샷이라고 볼 수 있다)
이름이 코어 덤프인 이유는.. 반도체가 없을 옛날옛적에 Magnetic Core를 사용했기 때문이라고 한다
이렇게 남겨진 코어 덤프들은 디버깅 및 오류 진단, 유지보수 단계에서 주로 사용된다
사전 정의된 Signal 종류
SIGHUP
터미널과의 연결이 끊어졌을 때 프로세스 종료
SIGINT
인터럽트 (ctrl + c 등) 걸렸을 때 프로세스 종료
SIGQUIT
인터럽트 (ctrl + \ 등) 걸렸을 때 코어 덤프
SIGILL
잘못된 명령을 사용했을 때 코어 덤프
SIGTRAP
trace, breakpoint 등에서 트랩이 발생했을 때 코어 덤프
SIGABRT
비정상적인 종료 시에 (abort 함수 실행될 때) 코어 덤프
SIGKILL
강제 종료
SIGBUS
버스 오류 발생 시 코어 덤프
SIGSEGV
세그멘테이션 폴트 오류 발생 시 코어 덤프 (Segmentation fault (core dumped))
SIGSYS
system call에 오류 발생시 코어 덤프
SIGPIPE
파이프 처리가 잘못 되었을 때 코어 덤프
SIGALRM
알람에 의해 발생하며, 해당 시그널이 들어오면 코어 덤프
SIGUSR1
사용자 정의 시그널 1 (기본 처리: 강제종료)
SIGUSR2
사용자 정의 시그널 2 (기본 처리: 강제종료)
SIGCHILD
자식 프로세스의 상태가 변할 때 호출됨 (기본 처리: 무시)
SIGSTOP
SIGCONT 시그널을 받을 때까지 프로세스 일시정지
SIGSTP
ctrl + z 입력 시 프로세스 일시정지
SIGCONT
SIGSTOP 및 SIGSTP로 인해 일시정지된 프로세스 실행될 때 호출됨 (기본 처리: 무시)
SIGVTALRM
가상 타이머가 종료될 때 (기본 처리: 강제종료)
'42 > 42s Cursus' 카테고리의 다른 글
[Rank 4] CPP 00 ~ 01 (0) | 2022.09.10 |
---|---|
[Rank 4] CPP Module (0) | 2022.06.17 |
[Rank 4] Cub3D - Raycasting 심화 - 텍스쳐 입히기 (2) | 2022.04.01 |
[Rank 4] Cub3D - Raycasting 구현 ⑤ 키 이벤트 (0) | 2022.04.01 |
[Rank 4] Cub3D - Raycasting 구현 ④ 화면에 벽 그리기 (0) | 2022.04.01 |