리눅스 시스템 프로그래밍이나, 혹은 c언어 시간에 signal은 잠깐 접해볼 기회가 있을 겁니다. 이 글에서는 signal 함수를 쓰고 있습니다만, 실습으로만 쓰고 있다는 점 참고 부탁드립니다. sigaction 쓰세요.

 


 signal이 들어오면 처리하는 방법은 몇 가지가 있습니다. 그냥 아무 로직도 태우지 않거나, 무시하거나, 혹은 해당 시그널이 발생했을 때 잡아서 특정 루틴을 수행하던지. 그런데, 이 중 몇 가지 예외가 있는데요. 무시하거나 잡을 수 없는 signal이 두 개 있어요. SIGKILL과 SIGSTOP. 이 둘을 간단하게 보도록 하겠습니다.

 

 먼저, SIGINT, SIGKILL, SIGSTOP, SIGTSTP 이렇게 4개의 signal 번호를 얻어봅시다.

 

 제 시스템에서는 2, 9, 19, 20번입니다.

 

 signal 함수로, 특정 시그널이 발생했을 때 잡을 수 있습니다. signal의 2번째 인자는 해당 시그널이 발생했을 때, 어떤 루틴을 수행할 것인지에 대해 정의를 합니다. 여기에서는 그냥 signal만 찍고 있음을 알 수 있습니다. 저는 SIGINT, SIGKILL, SIGSTOP 시그널을 수신했을 때, sig_hand를 호출하게끔 하였습니다.

 

 

 이제 test3을 실행시켜 보겠습니다. 그리고 ps -aux로 test3이 돌고 있는 프로세스의 pid 6676을 얻어올 수 있었습니다.

 

 2번 시그널을 날려 보겠습니다.

 

 그랬더니 test3을 실행시킨 프로세스에서 2가 출력됩니다. 제 시스템에서 SIGINT는 2번이고, SIGINT 시그널을 잡았기 때문에 핸들러가 수행된 셈입니다.

 


 이제 9번 시그널을 보내보겠습니다. 어떻게 될까요?

 

 9가 출력될 줄 알았는데, 그대로 종료되어 버립니다. 이는, 9번은 잡거나 무시될 수 없는 신호 중 하나이기 때문입니다.

 

 

 19번 SIGSTOP을 날려 보겠습니다.

 

 제가 SIGSTOP을 잡는다고 핸들러에 등록했음에도 불구하고 19가 출력되지 않고, suspended가 출력되었음을 알 수 있습니다. 추가로 비슷한 시그널 중에 SIGTSTP가 있습니다. 이것도 시그널을 보내면 suspend가 되게 하긴 합니다만 무슨 차이가 있을까요?

 

 

 SIGTSTP를 잡아보았습니다.

 

 test3을 실행시키고, ctrl+Z를 눌러보겠습니다. 그러면, 20이 계속 출력됨을 볼 수 있어요. SIGSTOP과 다르게 잡아버릴 수 있는 시그널입니다. fg에서 bg로 바꾸는 방법 중에 ctrl+Z를 누른 다음에 bg %N을 하라고 했었는데요. 제 리눅스 운영체제에서는, SIGTSTP를 발생시키고 bg %N을 입력하라는 말이였던 셈입니다.