리눅스 - 시그널 (SIGNAL) 코드 구현

2023. 7. 14. 23:30LINUX (Ubuntu)

시그널이란?

커널이 인터럽트가 발생하면, 해당하는 프로세스에게 인터럽트가 발생했다는 신호를 주는 것

 

시그널을 받은 프로세스

1. 현재 수행하는 제어 흐름을 정지한다.

2. 신속하게 시그널 처리기를 실행한다.

3. 시그널 처리가 끝난 후, 다시 돌아와 수행 제어 흐름을 회복한다.

 

--> 디폴트 처리기를 구동, 사용자 제공 시그널 처리기 구동, 무시 방법 등을 통해 시그널 처리 가능

 

그 중에서, alarm과 관련한 함수 사용을 해보려고 한다.

 

우선 Main 함수와 alarmHandler 함수를 구현해준다.

 

main에서는 두번의 alarm 인터럽트가 발생한다.

 

첫번째 signal 함수에서 SIGALRM에 대한 인터럽트가 발생할 경우, alarmHandler의 함수로 들어가 flag를 0으로 바꿔주고 print문을 출력한다. alarmHandler가 실행될 경우 while문의 무한루프를 빠져나오게 된다

 

두번째 signal 함수에서 SIGALRM에 대한 인터럽트가 발생할 경우, 이번에는 SIG_DFL로 바꿔 디폴트 처리기가 구동되게 바꿨다. 따라서 이번에는 alarmHandler가 실행되지 않고 '3초후 자명종이 울리게 된다.' 그리고 main이 끝난다.