모든 시그널은 SIG_ 로시작하는 Symbolic name을 가진다.
각각의 Signal에 대한 기본동작은 이미 OS단에서 정의되어있다.
더 자세히 설명하면?
시그널은 프로세스의 PCB 블록에 담겨있는 SIGNAL 관련 자료구조에 기본적인 액션이 명세되어있고,
이 기본 액션에 따라서 시그널이 도착하는 시점에 프로세스가 동작한다, 물론 sigaction 같은 함수를 통해 동작의 재정의가 가능하다.
POSIX에서 지정한 시그널 번호와 이름은 다음과 같다.
Signal symbolic name | Signal Number | default action |
Signal 0: question process alive? | 0 | |
SIGHUP | 1 | |
SIGINT | 2 | 프로세스에 인터럽트를 발생시켜 죽임 ( Ctrl+C ) |
SIGQUIT | 3 | |
SIGKILL | 9 | 프로세스 킬 |
SIGALRM | 14 | 알람 발생 |
SIGUSR1, SIGUSR2는 특정 signal 발생시 동작할 기능을 Customzing 하는데 쓰인다. (일단은 정의된 기본 기능이 없음)
지금 생각해보니 이름 - 번호를 매치시키고 외울 필요는 없다.
kill 함수없이 이미 정의된 shell 명령어 kill을 사용해도 process를 종료 시킬 수 있다.
구문
kill -9 'Process ID'
gedit으로 열어놓은 a.txt 프로세스 ID 2455을 대상으로
-9 (SIGKILL) 죽여라! 라는 시그널을 보내 프로세스가 종료되었다.
그럼 소스 코드내에서 특정 프로세스에게 SIGKILL을 보내는 함수를 아라보자!
Interface | int kill(pid_t PID, int sigNum) |
Parameter | PID: 시그널을 보낼 프로세스 ID * (Option 반드시 참조!) sigNum: 심볼릭 시그널 상수명 or 시그널 번호 |
Function | 해당 프로세스에게 sigNum에 정의된 시그널을 보냄. |
Return | 0: 성공 -1: 실패하고 errno 반환 |
Option | PID 양수: 특정 process ID에게 0: Process 자신이 속한 그룹 내의 모든 Process에게 -1: Signal을 보낼 수 있는 모든 Process에게 -1 외의 음수: 절대값을 취한 Process에게 |
예제 1
SIGINT (인터럽트 시그널)이 들어왔을 때
catch_sigint 라는 함수를 시그널의 핸들러 함수로 지정해두었다.
또 시그널을 등록한 상태로 pause 일시정지 상태가 계속 지속된다.
argument 인자 2개 (1st: Process ID, 2nd: Interrupt Number) 를 받는다.
SIGINT 의 인터럽트 번호는 2번이다.
결과
loop.out을 실행시키니 무한 루프 프로세스가 3201 이라는 process ID를 가진채로 백그라운드에서 돌아가고있다.
./kill 3201 2 를 입력하는 것은 loop 프로세스에게 SIGINT 시그널을 보내는 것과 같다.
=> SIGINT를 받은 loop 프로세는 "Catch SIGINT, but we no stop!" 을 띄우고 종료되지 않는다.
signal 함수를 통해 별도의 지정이 없는 경우 사실 SIGINT를 넘기면 프로세스가 종료되는게 기본 동작이다.
우리가 catch_sigint 라는 함수로 signal handler 함수를 재정의 했기 때문에 메시지가 출력되는 것이다.
예제2
그럼 10부터 0까지 카운트다운하는 process를 띄우기위한 소스코드를
test.c 로 작성해봤다.
그리고 고놈을 죽이기위한 kill함수를 이용한
특정 프로세스를 죽이는 main함수를 만들어봤다!
main.c
kill 속의 첫번째 인자
argv[1]은 프로세스 번호가 String형으로 들어와서 atoi (string->Interger)로 형변환하는 함수를 써줬고
두번째 인자 9는 SIGKILL의 심볼릭 상수!
결과
./main PID
여기서는
./main 5315
-> test 프로세스가 종료!
'LINUX > Linux' 카테고리의 다른 글
sigsuspend 함수 (0) | 2019.06.16 |
---|---|
Signal mask, set 함수 (0) | 2019.06.15 |
Signal 개념 (0) | 2019.06.15 |
pthread 함수 예제2 (0) | 2019.06.15 |
pthread 함수 예제 (0) | 2019.06.15 |