컴퓨터 공부/Advanced UNIX System Programming

[5월 7일 2교시] 시그널 1

려리군 2009. 5. 7. 10:04

시그널 

프로세스들 사이의 비동기적 사건의 발생을 전달.


종류 

SIGKILL : 핸들러 못바꿈. 프로세스를 강제로 종료.

SIGSTOP :  핸들러 못바꿈. 프로세스를 SIGCONT가 올때까지 멈춤.


SIGHUP : 터미널 단절, 데몬 프로세스 재수행.

SIGABRT : abort함수의 호출.

SIGALRM : 설정된 타이머에 의해 발생.

SIGCHLD : 프로세스 종료시 부모 프로세스에게 전달.

SIGFPE : 산술 연산 에러

SIGILL : 잘못된 기계어 수행.

SIGTERM : kill명령에 의해 발생하는 종료 신호(default0

SIGTSTP : ^Z를 누르면 발생.

SIGUSR1, SIGUSR2 : 응용 프로그램에서 프로그래머가 정의하여 사용


시그널의 발생

pending bits : 시그널이 오면 해당 FLAG비트가 set

block mask : unblock될 때까지 지연된 상태로 남음. <-> unblock


시그널 처리

ignore : SIGKILL과 SIGSTOP을 제외하고 모든 시그널 무시.

catch : 미리 등록된 함수(handler)가 수행.

default : 특별한 처리 방법을 선택하지 않음. 프로세스를 종료. 


#include<signal.h>

typedef void (*sighandler_t)(int); //int는 signo

sighandler_t  signal(int signo, sighandler_t handler)(int);

지정한 시그널 번호(signo)를 handler로 배치.

signo : 시그널 번호

리턴 : 이전 시그널 핸들러의 값. 실패시 SIG_ERR


시그널 발생함수

#include<signal.h>

int kill(pid_t pid, int signo);

프로세스 (그룹)에게 signo의 시그널을 보낸다.

pid>0 : pid인 프로세스에게 시그널을 전달.

pid==0 : 호출한 프로세스와 같은 그룹인 모든 프로세스에게 시그널 전달.

pid<-1 : -pid인 프로세스 그룹 ID와 같은 그룹인 모든 프로세스에게 시그널 전달.

int raise(ing signo);

자기자신에게 signo의 시그널을 보낸다.