이번엔 저번 시간에 배운 시그널을 c언어를 이용해 호출해보는 실습을 진행해보자.
Signal 알아보기 : suhwanc.tistory.com/127
Signal Handler
c언어에서는 함수 signal을 이용해 시그널을 핸들링하는 기능을 제공한다.
signal 함수는 다음과 같이 생겼다. -> signal(int signum, sighandler_t *handler)
첫 번째 인자는 시그널의 고유 ID이고, 두 번째 인자는 앞의 시그널에 대한 처리 루틴이다.
헷갈려서 위에 쓰지 않았지만, 이 함수는 이전 핸들러의 주소 포인터가 리턴된다.(반환값 : sighandler_t*)
두 번째 인자로는 그냥 handler 자체가 올 수도 있고, 특별하게 2가지가 더 올 수 있는데
SIG_IGN 이 오면, 앞의 signum에 해당하는 시그널이 오면 "무시해라!" 라는 의미이고 (ignore)
SIG_DFL 은 반대로 SIG_IGN을 한 시그널을 다시 원상태로 되돌려준다. (default)
signal 함수를 시그널의 "catching" 또는 "handling" 기능이라 하는데, 원래 같았으면 그냥 진행될 것을
함수로 받아 "다르게 처리한다" 라는 의미이다.
하지만 SIGKILL, SIGSTOP은 이런 기능이 작동되지 않는 시그널인데, 밑에서 직접 실행시켜서 확인해보자.
[실습]
Q1. 시그널을 ID 1 ~ 10 까지 핸들러로 수행하고, 만약 catching이 되지 않는다면 "not installed"를 출력하라.
Q2. SIGINT가 5번 발생 시 exit(0) 를 실행시켜 빠져나오시오.
[수행 코드]
[설명]
1. main 함수 for 문 & handler 함수 : handler 함수로 간 후, signal 함수를 실행시켜 "SIG_ERR"과 비교한다.
아까 말했듯, signal은 핸들러 포인터를 리턴하는데, 만약 "catching" 되지 않았다면, "SIG_ERR"을 리턴하게 된다.
2. handler1 함수 : handler1은 "SIGINT"가 발생되는 특정 상황에서 호출된다. 따라서 이 함수가 5번 호출되었다면, exit(0)을 호출해 빠져나온다.
3. while(1) : 프로그램이 바로 종료되는 것을 막기 위하여 무한 루프를 설정해놓는다. 만약 이 구문이 없다면 SIGINT를 받기도전에 프로그램은 기다리지 않고 종료될 것이다.
추가) re-entrant와 non-re entrant
re-entrant는 재귀함수처럼 어떤 함수가 실행 중인데, 그 함수가 계속 들어오는 상황을 의미하고
non-re entrant는 함수 실행중에는 다른 함수가 들어오지 않는 것을 의미한다.(동일한 함수일지라도)
잘못된 부분 지적 언제든지 환영합니다~^^
'System Programming(ARM)' 카테고리의 다른 글
8. Two-pass Assembler (0) | 2020.12.06 |
---|---|
9. Exceptional Control Flow(흐름 제어) (0) | 2020.12.03 |
10. Signals (0) | 2020.12.03 |
[ARM] 디버깅하는 법 (0) | 2020.11.08 |
[ARM] 반복문으로 문자열 출력하기 (0) | 2020.11.08 |