치춘짱베리굿나이스

[Rank 2 / 3] Minitalk / Minishell - 시그널이란 본문

42/42s Cursus

[Rank 2 / 3] Minitalk / Minishell - 시그널이란

치춘 2022. 4. 28. 12:33

signal이란?

프로그램 구동 중에 Interrupt가 발생했을 때, 프로세스에 어떠한 Interrupt가 발생했음을 알리는 간단한 메시지를 전송하는 것

signal을 받은 프로세스는 해당 시그널이 무엇인지에 따라 지정된 기본 동작을 수행하거나, 사용자가 정의한 함수에 의해 무시하거나, 또는 사용자 정의 함수를 통해 특별한 처리를 해 줄 수 있다

예시

프로세스 동작 중에 ctrl + c를 누르면 프로세스가 종료 (kill) 되는 현상도 Signal이 발생하였다고 볼 수 있다

Signal 함수 종류

<signal.h> 헤더에 기본적인 동작들과 signal 관련 함수들이 정의되어 있음

기본적으로 정의된 동작은 주로 프로세스를 종료하거나, 코어 덤프를 생성

Kill

int kill(pid_t pid, int sig);

Kill 함수


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

가상 타이머가 종료될 때 (기본 처리: 강제종료)

Comments