본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스 / 유닉스 ] 시그널이란? 시그널(SIGNAL) 종류, 상황, 유사 시그널 차이점

반응형

[리눅스 유닉스 완전 정복 목차]

안녕하세요~

오늘은 시그널 SIGNAL 에 대한 간략 포스팅을 진행하고자 합니다!

트와이스의 곡 시그널이 유행(?)하면서 시그널이 신호를 의미한다는건 다들 알고 계실거고...

IT에서 시그널이란 리눅스나 유닉스에서만 한정된 개념이 아니라 운영체제 즉, 시스템에 있는 보편적 개념입니다!

다만 리눅스마스터 자격증에서 시그널 문제가 꽤 보이는 것 같아... 작성할 뿐..ㅎㅎ

그래서 시그널 (SIGNAL)이 뭐야?

말그대로 특정 이벤트가 발생하였을 때 신호를 보내서 알려주는 걸 시그널이라해요!!

대표적 예를 들어, 프로그램이 돌아가고 있을 때 리눅스에서 [CTRL] + [c]나 [CTRL] + [z] 를 눌러서 프로그램을 강제 종료시킨 적 있으시죠?? 또는 우리가 자주 사용하는 윈도우에서는 [Alt] +[F4] 누르면 실행중인 프로그램이 종료되는 거 해본 적 있으신가요?ㅎㅎ

프로그램이 돌아가고 있는데 어떻게 중지되었지??? 누군가가 개입해서 강제로 종료시킨거잖아요!

특정 키가 들어왔을 때 인터럽트가 발생하여 운영체제가 프로그램에 제제를 겁니다.

즉 예외사항이 발생했다 싶으면 신호가 던져지고 운영체제가 이를 캐치해서 해결을 위해 행동을 취하는거죠 ㅎㅎ

 

시그널은 인터럽트의 일종이라고 생각하면 돼요.

▼인터럽트가 무엇인지 잘 모르시는 분은, [운영체제 목차]에 있는 인터럽트 포스팅을 참고해주세요!

 

그리고 이런 경우가 있을 수도 있어요,

서버 부하테스트를 위해서 내가 러시(rush) 테스트를 하는 코드를 짰는데, 특정 키를 눌렀을 때, 대기하고 있던 스레드가 동시에 통신을 쏘게 하고 싶다.~~

이런 식으로 특정 이벤트를 의도하게 하고 싶다~~~ 특정 키가 눌렸을 때 시그널을 잡아서 행동을 취하게 할도 있어요. (밑에 나오겠지만 이런걸 signal handler라고 합니다) 멀티서버, 통신 프로그래밍 쪽을 하면 한 번쯤은 시그널을 접하게 될 거예요 ㅎㅎ (sigaction함수 등..)

일단 이번 포스팅은 코딩에 관한 포스팅이 아니라 개념에 관한 포스팅이므로~~ 시그널의 개념과 종류에 대해서 살펴보도록 합시다.

 

사진 출처: http://contents.kocw.or.kr/document/10_Signal.pdf

▼[시그널이란? 리눅스 마스터 1급 정복하기 책에서 발췌]

시그널(Signal)의 사전적인 뜻은 '신호'라는 의미로 리눅스에서는 프로세스끼리 서로 통신할 때 사용한다.

즉, 특정 프로세스가 다른 프로세스에 메시지를 보낼 때 시그널을 이용한다.

리눅스에서 사용하는 시그널에는 사용자가 인터럽트 키를 통한 발생하는 시그널, 프로세스가 발생하는 시그널, 하드웨어가 발생하는 시그널 등 매우 다양하다. 

지원하는 시그널 확인 법

운영체제가 개입해서 처리해줘야 할 다양할 상황이 있으므로 결국 다양한 시그널의 종류가 존재하는데

시그널의 종류는 대부분 비슷하긴 하겠지만 그래도 OS마다 차이가 있습니다.

 

시그널 목록을 확인하고 싶을 때에는

kill -l 

명령어를 치면 됩니다.!

우분투에서 확인해본 시그널 종류!
유닉스 AIX서버에서 확인해본 시그널 종류

보통 특정 액션이나 상황에 의해 시그널이 발생하면, 이를 구분하고 위해 미리 정의된 상수를 사용합니다. 시그널마다 유일한 번호가 붙여져 있어요. 저기 사진 앞에 숫자는 시그널 번호를 의미합니다.

그럼 시그널을 어떻게 보내는가?

시그널들이 보내지는 동작은 지정이 되어있다만,, [Ctrl]+[z]누르면 종료되듯이..

특정한 프로세스에 시그널을 보내기 위해서 KILL 함수를 사용할 수 있습니다.

(kill이외에도 raise, abort, sigsend등 시그널을 보내기 위한 함수는 여러 가지가 있습니다.)

 

프로세스를 강제로 종료하는 kill 명령어 kill함수와 헷갈리지 마시길!

kill 명령도 사실 인자로 지정한 프로세스에 시그널을 보내는 명령어 입니다.

$ kill -signal pid

한 예로 프로세스를 강제로 죽일 때 인자로 9를 붙였던 이유가 9가 SIGKILL을 의미하기 때문이었습니당~~

$ kill -9 1001

1001 프로세스를 죽인다.

시그널 핸들러 (signal handler)

보통 프로세스가 시그널을 받았을 때 기본 처리 방법은 프로세스를 종료하는 것이 대부분입니다. (종료가 아닌 것들도 있음, 기본적으로 지정이 되어 있어요 ㅎㅎ 종료한다던가 무시한다던가 재시작을 한다던가 등)

그러나 어떤 시그널을 받았을 때 특정 동작을 하도록 내가 정의하고 싶을 경우에는, 원하는 코드를 짜서 함수로 지정해줄 수 있는데 그걸 시그널 핸들러라고 합니다 ㅎㅎ

시그널을 받아서 내가 핸들할게~~~ 대표적인 함수는 sigaction이 있죠 ㅎㅎ 나중에 소켓 프로그래밍 할 때 다뤄볼게요 ㅎㅎ

시그널 함수는 자동으로 시그널을 발생하게 할 수도 있고 간격을 둘 수도 있고 그냥 이벤트처럼 발생했을 때 캡처하게 할 수도 있고 플래그를 넣을 수도 있고,, 처리하기 위해 다양한 함수들이 존재합니다. 

 

스레드가 종료되었을 때, 자원해제를 해주는 대표적 함수도 결국 스레드 종료를 시그널로 받아 처리하는 함수..

시그널도 MAN 명령어가 있다.

$ man 7 signal

이와 같은 명령어를 입력하면

이렇게 signal에 대한 모든 자세한 정보들을 확인할 수 있습니다.

역시 man명령어! ㅎㅎ

시그널의 종류

이제 드디어 그 많은 시그널들이 각각 언제 발생하는 지 살펴보도록 해요~

시그널 발생 시 지정되어 있는 처리 방식은 크게 '종료, 무시, 코어 덤프, 중단, 재시작' 등이 있습니다.

기본 처리 중 하나인 코어 덤프한다는 건 비정상적으로 종료했을 때 특정 시점에 작업 중이던 메모리 상태를 기록하는걸 말해요. 즉 [CTRL] + [c]를 눌러서 SIGINT 시그널이 발생하게 되면, 실행되는 프로그램을 종료시키면서 지금 실행중인 작업을 메모리에 기록한다는거 ㅎㅎ

 

번호

이름

설명

기본 처리

1

SIGHUP

(HUP)

HangUP의 약어로 로그아웃과 같이 터미널에서 접속이 끊겼을 때 보내지는 시그널입니다.

데몬 관련 환경 설정 파일을 변경시키고 변화된 내용을 적용하기 위해 재시작할 때 이 시그널이 사용됩니다.

종료

2

SIGINT 

(INT)

키보드로부터 오는 인터럽트 시그널로 실행을 중지. 

[CTRL]+[c] 입력 시에 보내지는 시그널입니다.

종료

3

SIGQUIT 

(QUIT)

키보드로부터 오는 실행 중지 시그널.

[CTRL] + [\] 입력 시에 보내지는 시그널입니다.

기본적으로 프로세스를 종료시킨 뒤 코어를 덤프하는 역할을 합니다.

코어 덤프

4

SIGILL 

(ILL)

illegal instruction의 약자입니다. 잘못된 명령을 사용했을 때 발생합니다.

코어 덤프

5

SIGTRAP 

(TRAP)

trace(추적), breakpoint(중지점)에서 TRAP 발생할 때 

코어 덤프

6

SIGABRT (ABRT)

abort의 약자로 비정상종료 함수에 의해 발생합니다. 

(즉 abort 시스템 호출을 하였을 때 발생)

코어 덤프

7

SIGBUS

메모리 접근 에러시 발생하는 시그널입니다.

코어 덤프

9

SIGKILL (KILL)

KILL! 무조건 종료, 즉 프로세스를 강제로 종료시키는 시그널!

종료

11

SIGSEGV

invalid memory reference

종료 +

코어덤프

15

SIGTERM (TERM)

Terminate의 약자로 가능한 정상 종료시키는 시그널로 kill 명령의 기본 시그널입니다.

종료

17

SIGCHLD

(child)

자식 프로세스가 stop 되거나 종료되었을 때 부모에게 전달되는 신호입니다. (멀티 프로세스 코딩에서 자세한 사용법은 배울 거..)

무시

18

SIGCONT (CONT)

Continue의 약자로 STOP 시그널에 의해 정지된 프로세스를 다시 실행시킬 때 사용됩니다.

재시작

19

SIGSTOP (STOP)

터미널에서 입력된 정지 시그널입니다. SIGCONT로 재실행시킬 수 있습니다.

중지

20

SIGTSTP (TSTP)

실행 정지 후 다시 실행을 계속하기 위해 대기시키는 시그널입니다.

[CTRL] + [z]를 입력했을 때 보내지는 시그널입니다.

SIGCONT로 역시 다시 실행시킬 수 있습니다.

중지

29

SIGIO

비동기 입출력이 발생했을 경우 ! (I/O now possible!)

종료

잘 나오는 시그널 몇 가지를 정리해봤어요 ㅎㅎ

물론 시그널을 사용자가 정의해주는 것도 가능합니당 ㅎ

SIGHUP

SIGHUP을 프로세스에게 주면 해당 pid 프로세스가 다시 시작되는 것을 볼 수 있습니다. 그래서 데몬 프로세스의 설정을 마치고 설정 내용을 재적용시킬 때 자주 사용돼요

$ kill -HUP 4209

4209 프로세스를 재시작..

SIGKILL vs SIGTERM

보면 SIGKILL과 SIGTERM이 똑같이 종료시키는건데 무슨 차이일까 궁금할 수 있어요 ㅎㅎ

재미있는 짤(?)이 있기에 가져왔습니다 ㅎㅎ

사진출처: https://www.quora.com/What-is-the-difference-between-the-SIGINT-and-SIGTERM-signals-in-Linux-What%E2%80%99s-the-difference-between-the-SIGKILL-and-SIGSTOP-signals

요약하면, 프로세스가 스레드 자식들이 여러 개가 있을 때, SIGTERM으로 죽이면,

스레드에게 다른 자식 스레드와 인사를 나눌 기회도주고,,, 자식들이 그들의 작업들을 종료하고 서로 안녕,, 곧 죽을꺼야..잘있어.. 인사도 하게 해주고,, 프로세스의 삶을 잘 보장시켜주고 죽이는게 SIGTERM. ㅋㅋㅋ

 

반면 SIGKILL은 잔인하게 작업이 끝날때까지 일말의 여유도 주지 않고, 인사할 시간도 없이 단번에 목을 따버리는(?)게 SIGKILL이라고 재밌게 그려놨네요 ㅋㅋ

SIGSTOP vs SIGTSTP

둘다 프로세스를 대기시키는건데 그럼 얘네 둘의 차이점은 무엇일까요??

가장 큰 차이점은 SIGSTOP 시그널은 프로그램틱하게 보내집니다, 즉 kill -STOP pid 하면 SIGSTOP이 전송됨.

그런데 SIGTSTP의 TSTP는 terminal stop의 약자로 stop외에 앞에 terminal이라는 단어가 붙었죠?

SIGTSTP는 유저가 키보드로 [Ctrl] + [z]를 입력했을 때, tty driver를 통해서도 신호가 전달된다는 특징이 있습니다. 

또한 SIGSTOP은 무시될 수 없는데 SIGTSTP는 가능하게 할 수 있습니다.

(참고로 tty는 가상콘솔, 가상터미널을 의미합니다.)

▼tty 관련된 포스팅

 

가상콘솔이란?(Virtual Consoles)-변환 단축키와 tty 명령어, shutdown 확인 실습

리눅스 완전 정복 : 리눅스 목차 가상 콘솔(Virtual Consoles)이란? 가상 콘솔이란 '가상의 모니터'라고 생각하면 이해하기 쉬워요. 윈도우는 멀티유저 시스템이 아니라 익숙치 않을 수도 있겠지만 리눅스나 유닉..

jhnyang.tistory.com

SIGSEGV

SIGSEGV는 친구들 사이에서 '똥싸고 죽는다'라고 부른다. 길게 Segmentation Violation 혹은 Segmentation Fault라 불리우는 이 시그널은 '비정상종료' 혹은 '메모리엑세스 오류' 혹은 '미친짓' 등등 -_- 으로 인해 OS에 의해 강제로 종료될 때 발생하고, Unix 계열에선 이 경우 메모리덤프 파일인 core를 남기고 죽는다고 해서 '똥싸고 죽는다' 라고 표현한다. (core를 이용해 디버깅을 할 수 있는 친절한 유닉스 ㅠㅠ) 윈도우 계열에서는 보기싫은 에러 다이얼로그가 뜨면서 죽기 때문에 역시 '똥싸고 죽는구나' 라고 표현이 가능할지도...

출처: http://seorenn.blogspot.com/2011/02/sigsegv.html

 

SIGSEGC는 대게 비참조 되는 널이나 초기화되지 않은 포인터를 참조했을 때 많이 발생합니다.ㅎㅎ

기출 문제

[리눅스 마스터 1급 1802회]

다음 중 시그널(Signal)에 대한 설명으로 알맞은 것은?

1. SIGKILL은 터미널이 시작될 때 보내오는 시그널이다.

2. SIGINT는 키보드로부터 오는 인터럽트 시그널로 실행을 중지시킨다.

3. SIGQUIT는 터미널에서 입력된 정지 시그널로 [CTRL]+[c] 입력시 보내진다.

4. SIGSTOP은 실행 정지 후 다시 실행하기 위해 디기시키는 시그널이다.

답: 2번

 

[리눅스 마스터 1급 1901회]

다음 중 시그널(signal)이 발생하는 키 조합으로 틀린 것은?

1. [ctrl] + [c]

2. [ctrl] + [d]

3. [ctrl] + [z]

4. [ctrl] + [\]

답: 2번

 

다음 설명에 해당하는 시그널(Signal)로 알맞은 것은?

-----------------------------------------------------------------

로그아웃과 같이 터미널에서 접속이 끊겼을 때 보내지는 시그널이다.

데몬 관련 환경 설정 파일을 변경시키고 변화된 내용을 적용하기 위해 재시작할 때 이 시그널이 사용된다.

-----------------------------------------------------------------

1. SIGHUP

2. SIGINIT

3. SIGSTOP

4. SIGQUIT

답: 1번

 

[리눅스마스터 2급 2차 2016년 2회]

다음 중 [Ctrl] + [c] 입력 시 전송되는 시그널로 알맞은 것은?

1. SIGHUP 2. SIGTERM 3. SIGINT 4. SIGQUIT

답: 3번

 

[리눅스마스터 2급 2016년 3회 2차]

다음 중 [Ctrl]+[z]를 입력했을 대 보내지는 시그널 번호로 알맞은 것은?

1. 2 2. 3 3. 19 4. 20

답: 4번

 

오늘 준비한 포스팅은 여기까지입니다!ㅎㅎ

댓글 or 공감 or 광고보답은 질 좋은 포스팅을 공유하는데 힘이됩니당

아ㅏㅏ아ㅏㅏ 내일 월요일이라니 믿기지 않네요... 마지막 주말 모두 잘 마무리하세요 ! :)

반응형