자유롭게 게시물을 올릴수있는 게시판입니다.
  • 유년추억
  • 학교생활
  • 입시준비
  • 대학생활
  • 군생활
  • 알바생활
  • 취업준비
  • 직장생활
  • 원룸생활
  • 연애중
  • 결혼준비
  • 집안살림
  • 자녀교육
  • 창업준비
  • 이민유학
  • 노후생활
  • 전체보기


유닉스 예외 처리와 시그널 처리 ^^

 
예외 처리란?

위와 같은 프로그램내에서 필요에의해 발생된 인터럽트와는 달리
예상치못한 상황(0으로나누는것,정전사태,불법메모리 엑세스등)
과 같은 비동기적 사건에서 발생되는 것들을 따로 묶어서 예외상태라
합니다. 물론 그동작은 인터럽트와 똑같죠. 그러나 하드웨어적인
인터럽트와의 차이점은 인터럽트 대신에 신호를 사용한다는 겁니다.
아래에서 이에 관한 시그널 처리를 알아 보겠습니다.


[유닉스의 시그널 처리]

시그널(signal)이란 말그대로 신호 즉 커널이 프로세스에게 어떠한
신호를 보내거나 한프로세스가 다른 프로세스에게도 신호를 보내는
등의 일을 말합니다.

그럼 왜 신호가 필요 할까요..?

프로그램은 때때로 다음과 같은 예상치 못한 사건들에 대해 대처를
해야 하는데 이들은 보는것 처럼 언제 일어 날지 모르는 비동기적
사건이므로 이를 처리하기 방편으로 바로 시그널(신호)를 사용합니다
이런 사건들이 발생 했을때 커널이 해당 프로세스에게 야 너 지금
이런 일이 일어났으니 대처 하라고 알려주는거죠.. 이 알려준다는게
바로 신호를 보낸다는 겁니다..

* 부동 소수점 에러
* 정전
* 알람클록
* 자식프로세스의 죽음
* 사용자의 종료 요구(control C)
* 사용자의 일시 중지 요구(control Z)


처리 과정 : 이런한 사건이 일어나면 커널은 이를 일으킨 프로세스에게
신호를 보내고 그프로세스를 일시정지 시킨후 신호처리기를
구동시킨다.
이렇게 해서 그신호처리후 다시 그프로세스를 처리하게 됩니다.
이렇게 미리 정의된 커널의 신호처리기를 수행할수도 있는거고
또 프로그램내에서 따로 정의해서 처리시킬수도 있습니다.

또한 프로세스들끼리도 서로 신호를 보내기위한 방법으로
kill()이라는 시스템콜을 사용하게됩니다..
참고로 왜 kill() 이라는 이름이냐 하면 초창기 유닉스에서
프로세스간의 신호는 프로세스를 죽이는 신호밖에 없었기
때문에 kill이라는 이름아 붙은 겁니다. 지금은 여러가지용도의
신호에 사용되죠.

신호의 처리의 한가지 예 :

지금 전면(포그라운드)에서 실행중인 프로세스를
강제로 종료시키기 위해 우리는 Control_C를 누르게 됩니다.
터미널 드라이버가 이 control_c를 인식하면 현재 전면 작업중에있는
모든 프로세스들에게 SIGINT라는 시그널을 전달하게 됩니다. 이를
받은 프로세스는 작업을 중단하고 커널의 신호 처리기가 수행되어
SIGINT에 적합한 처리를 하여 프로세스의 작업을 강제로 종료 시켜
버리는 겁니다.
인터럽트 처리과정과 똑같다고 보시면됩니다.

또 위에서 단순히 신호를 주고 받는다는 추상적인 말을 썼는데
실제에 있어서는 커널에는 모든프로세스의 관리를 위한 테이블을
마련해 두고있는데 여기에 보면 각 신호의 수신을 위한 비트열
들이 있게됩니다. 이 비트열들중에 하나를 세트시키거나 하여 신호를
알리는 것입니다. 다음올라갈글인 프로세스 구조를 다루게 될것인데
거기 보시면 완전히 이해 가실겁니다.


constantine
2002-09-25 01:13:44
873 번 읽음
☞ 로그인 후 의견을 남기실 수 있습니다
 캐시선물





365ch.com 128bit Valid HTML 4.01 Transitional and Valid CSS!
태그