○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 |