○Signal

 ▷프로세스에 특정 사건이 일어났음을 알리는 작은 메세지

 

 ▷Exception, interrupts와 유사

 ▷Kernal -> Process

 ▷작은 Int값 ID로 식별

 

 ▶전송

  ▷Kernal이 Destination pprocess에 전달

  ▷Destination process의 내용의 상태를 Update함으로써 전달.

 

  ▶전달하는 경우

   ▷Kernal이 system event (SIGFPE, SIGCHLD)를 감지했을 경우

   ▷process가 다른 process에게 kill Signal을 보낸 경우

 

  ▶전달 방법

   ▷kill 명령어로전달 (pid / grp)

   ▷Ctrl-c / Ctrl-z

   ▷kill 함수로 전달

 

 ▶수신

  ▶동작의 종류

   ▷Ignore : 무시

   ▷Terminate : process 종료

   ▷SIGCONT 대기 : SIGCONT가 올 때 까지 정지

   ▷Catch Signal handler : Signal handler 호출 (Exception catch와 유사)

 

  ▶pnb = pending & ~block 계산

   ▷Pending되었지만, Nonblocked인 bit vector

   ▷pnb == 0 : 원래 instruction 계속 수행

   ▷pnb != 0 : signal을 받아 적절한 처리, 처리 후에는 원래 Control flow로 돌아감.

 

  ▶Signal Handler Install

   ▷handler_t *signal (int signum, handler_t *handler)

    ▷signum : Handler를 설치 할 

    ▶handler

     ▷SIG_IGN : ignore

     ▷SIG_DFL : default action

     ▷Address of user defined-function

 

   ▶handler 함수

    ▷유저가 정의한 Signal의 행동 함수

    ▷Handling중에는 동일한 Signal은 Block

    ▷동일 프로그램에서 동시에 진행되기 때문에, 주의해야함.

 

    ▶가이드라인

     ▷되도록 짧고 간결하게

     ▷async-signal-safe 함수들만 사용 - printf, sprintf, malloc은 안전하지 않음

     ▷errno를 저장하고 끝나기 전에 복원해라

     ▷shared data에 접근하는 동안 다은 signal을 막아라

     ▷global 변수를 volatile로 선언해라 (레지스터에 저장하지 않음)

     ▷global flag를 volatile sig_atomic_t를 이용해서 선언해라 (flag의 변경 - atomic하게)

 

    ※안전한 I/O 라이브러리

 

 

 ▶Pending

  ▷전송했지만, 수신되지 않은 상태

  ▷Signal은 Queue가 되지 않음 -> 동일한 Type의 Signal은 단 하나만 Pending될 수 있음 (그 뒤에 오는것들은 버림)

  ▷각 프로세스에서 bit vector로 관리 (각 Signal마다 0, 1)

 

  ▶Block (signal mask)

   ▷Pending해둔걸 받지 않고 그 상태에 놔둠

   ▷Unblock된다면, 그 때 받음.

   ▷각 프로세스에서 bit vector로 관리

   ▷sigprocmask : 명시적 Block / Unblock

   ▶Signal Mask 함수들

 

   ◎Temporarily Blocking

 

 

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Shell  (0) 2020.12.12
Process Control  (0) 2020.12.11
Exception Control  (0) 2020.12.03
Library  (0) 2020.12.01
Linking  (0) 2020.12.01

+ Recent posts