시그널
동기적 시그널 : 프로세스의 어느 정해진 동작과 관련되어 있어서 그 동작을 하는 동안 전송되게 된다.(단, 프로세스의 시그널이 Mask되지 않을 때) ex) 메모리 확보 예외, 잘못된 명령 실행 등
비동기적 시그널 : 실행되는 프로세스의 제어 밖에 있는 외부 사건에 의해 발생한 시그널
예측할 수 없는 시간에 도착하며 Mask되지 않은 어떤 다른 프로세스에 적용되도록 요청한다.
ex) Ctrl + C, Ctrl + Z, Kill 커맨드에 의한 시그널 전송

시그널 마스크 란?
시그널을 보내면 안되는 경우, 마스크를 하게되면 그 동안에는 시그널이 보류되고, 마스크가 해제되면 전달되게 된다. 중복된 시그널이 도착하면 모두 삭제되고 하나만 남아있게 된다.

시그널 수신 시 동작의 변경이 자유로우나 SIGKILL, SIGSTOP은 예외이다.

시그널 수신 시 5가지 동작
종료 : 프로세스 종료
코어 덤프 : 프로세스의 코어 덤프 파일을 작성하고 종료(코어 덤프 파일은 프로그램 비정상 종료시 메모리 상황을 기록한 파일로 어디서 오류가 났는지 알 수 있음, 디버깅 모드로 컴파일하면 좀 더 자세한 정보가 기록됨, 실행중인 프로세스에 시그널을 날려 강제로 파일을 생성할 수도 있다.)
무시 : 시그널 전송을 비롯하여 아무것도 하지 않음
정지 : 프로세스의 실행 (일시) 정지
계속 : (정지상태의) 프로세스의 실행 재시작


실시간 시그널
POSIX에서 시그널 처리가 가지는 단점을 보완하기 위해 규정한 사양
시그널이 큐에 보관되어 생성된 횟수만큼 전송됨
작은 시그널 번호부터 배송됨
시그널 번호뿐 아니라 시그널 번호, 에러번호, 시그널 코드, 시그널 번호에 해당한 보다 상세한 정보등을 전달해줌

시그널핸들러는 응용프로그램에서 사전에 설정해두어야 하며 시그널이 발생되면
시그널 생성, 마스크 검사, 전송, 복귀처리를 한다.
시그널 핸들러 설정 -> do_sigaction 함수의 sighand 구조체 설정
시그널은 프로세스 혹은 프로세스 그룹에 대해 생성
실시간 시그널이 아니고 동일한 시그널이 생성되어 있을 경우엔 전송하지 않음
실제처리는 send_signal 함수가 수행
실시간 시그널일 경우 sigqueue 구조체를 확보해야 하는데 메모리가 부족하면 시그널이 생성되지 않을 수 있다. 하지만 sigaddset()의 비트 설정으로 끝나기 때문에 시그널은 생성된다.
그래서 SIGKILL이나 SIGSTOP이 송신될 수 있는 것이다.

시그널 마스크는 task_struct에 비트 설정/제거 로 수행
전송될 시그널이 있을 경우 TIF_SIGPENDING 플래그 설정

시그널 핸들러 종료 시 스택 상에 쌓인 주소로 처리 이동

i found out that has some problem
but i dont no what it is
hu~ 

+ Recent posts