Microsoft PowerPoint - 10_Signal

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "Microsoft PowerPoint - 10_Signal"

Transcription

1 Operating System Laboratory 시그널 - IPC - 시그널의종류 - 시그널구현함수 IPC 프로세스간통신 (Inter-Process Communication) 실행중인프로세스간에데이터를주고받는기법 IPC 에는매우많은방법이있다! File Pipe/Named pipe Socket Shared memory Message passing Remote Procedure Call (RPC)

2 시그널 특정이벤트가발생했을때프로세스에게전달하는 신호 연산오류발생, 자식프로세스의종료, 사용자의종료요청등 굉장히작은값이다. 인터럽트 (interrupt) 라고부르기도한다. 용도가제한적이며여러시그널이겹칠경우원치않는결과가발생할위험이있다. 시그널은여러종류가있고각각에유일한번호가붙여져있다. 프로그램내에서는매크로상수를사용한다. 예 1) Ctrl + C 를누를때 SIGTERM 이전달된다. 예 2) kill 명령을사용하면해당프로세스에게 SIGTERM 이전달된다. 시그널 시그널을수신한프로세스의반응 1. 시그널에대해기본적인방법으로대응한다. 대부분의시그널에대해서프로 세스는종료하게된다. 2. 시그널을무시한다. 단, SIGKILL과 SIGSTOP은무시될수없다. 3. 프로그래머가지정한함수 ( 핸들러 ) 를호출한다. 시그널핸들러 (handler) 프로세스가특정시그널을포착했을때수행해야할별도의함수 프로세스는시그널을포착하면현재작업을일시중단하고시그널핸들러를실행 시그널핸들러의실행이끝나면중단된작업을재개 시그널종류 "/usr/include/asm/signal.h"

3 시그널 시그널 SIGABRT 설명 process aborted 시그널 SIGALRM 설명 signal raised by alarm SIGBUS bus error SIGCHLD child process terminated SIGCONT continue if stopped SIGFPE floating point exception SIGHUP hangup SIGILL illegal instruction SIGINT interrupt SIGKILL kill SIGPIPE write to pipe SIGQUIT quit and dump core SIGSEGV segmentation violation SIGSTOP stop temporarily SIGTERM termination SIGTSTP terminal stop signal SIGTTIN/ SIGTTOU background process attempting to read/write SIGUSR1/ SIGUSR2 user defined 1/2 SIGPOLL pollable event SIGPROF profiling timer expired SIGSYS bad syscall SIGTRAP trace/breakpoint trap SIGURG urgent data available SIGVTALRM virtual timer expired SIGXCPU CPU time limit exceeded SIGXFSZ file size limit exceeded 시그널구현함수 시그널을다루기위해필요한시스템호출 / 표준라이브러리함수 sigemptyset sigfillset sigaddset sigdelset sigaction sigprocmask kill raise alarm pause 함수 의미시그널집합을시그널이없는비어있는상태로초기화시그널집합을모든시그널이포함된상태로초기화시그널집합에특정시그널을추가시그널집합에서특정시그널을삭제특정시그널에대한프로세스의행동을설정봉쇄할시그널의목록을변경특정프로세스에게특정시그널을전달자기자신에게특정시그널을전달설정된시간이경과한후에자기자신에게시그널을전달시그널이도착할때까지대기상태유지

4 시그널처리과정 프로그램에서처리할시그널선정 (sigfillset, sigaddset, ) 시그널을처리할동안방해받지않도록 mask 설정 (sigprocmask) 각시그널에대한처리행동지정 (handler 함수구현 ) signal 프로세스 handler mask 에설정된시그널금지 handler 실행금지된시그널해제수신된시그널이있으면반복 시그널집합조작 시그널집합을생성하거나조작 시그널을다루려면시그널집합을만들어야한다. #include <signal.h> int sigemptyset (sigset_t *set); int sigfillset (sigset_t *set); int sigaddset (sigset_t *set, int signum); int sigdelset (sigset_t *set, int signum); int sigismember (const sigset_t *set, int signum); set signum 반환값 sigset_t 형의시그널집합 시그널번호호출이성공하면 0을반환, 실패하면 -1을반환한다. sigismember는호출이성공하면 1이나 0을반환하고실패하면 -1을반환한다.

5 시그널집합조작 사용예 sigset_t set; int result; sigemptyset(&set); sigfillset(&set); sigdelset(&set, SIGALRM); sigaddset(&set, SIGALRM); result = sigismember(set, SIGALRM); sigaction 특정한시그널을받았을때프로세스가취해야할행동을지정 signum 으로지정한시그널에대해서 act 로지정한행동을취한다. 새로운행동인 act 가등록되면서기존의행동은 oldact 에저장된다. #include <signal.h> int sigaction (int signum, const struct sigaction *act, struct sigaction *oldact); signum act oldact 반환값 시그널번호이다. SIGKILL과 SIGSTOP은적용할수없다. 프로세스가지정한시그널에대해서취해야할행동에관한정보가담겨져있다. 이전에지정되어있는시그널에대한행동이저장된다. 보통 NULL 값을사용한다. 호출이성공할경우 0을반환하고, 실패하면 -1을반환한다.

6 sigaction struct sigaction 시그널핸들러, signum 으로지정한특정시그널이들어왔을때수행해야할행동을저장하는구조체 struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; } sa_handler: 시그널에대응하는행동 SIG_DFL SIG_IGN 함수의포인터 기본적으로설정된행동. 대부분의시그널에대해서프로세스는종료. 해당시그널을무시. 지정한시그널에대한행동없음. ( 단, SIGSTOP과 SIGKILL은무시할수없음 ) 사용자가지정한함수 sigaction sa_sigaction sa_handler 대신에사용할수있다. sa_handler 에비해추가정보를알수있다. sa_sigaction 과 sa_handler 중에하나만사용한다. sa_sigaction 을사용하려면 sa_flags 를 SA_SIGINFO 로지정한다. sa_mask 시그널마스크 : 봉쇄된시그널들의집합 sa_mask 에등록된시그널은시그널핸들러가실행되는동안봉쇄된다. 봉쇄 (blocking) 무시가아니라시그널핸들러실행이완료될때까지처리가미뤄진다. 현재처리중인시그널도봉쇄된다.

7 sigaction sa_flags 시그널처리절차를수정하는데사용된다. 여러플래그를사용하고싶으면 (bitwise-or) 사용 값 SA_SIGINFO SA_NOCLDSTOP SA_RESETHAND SA_NODEFER sa_handler 대신에 sa_sigaction을선택 signum이 SIGCHLD일때자식프로세스가종료되거나중단되더라도부모프로세스는이를알려고하지않는 다. 의미 signum에대해서시그널핸들러를최초에한번만실행하고그다음부터는동일한시그널에대해서 SIG_DFL에해당하는기본적인동작만수행하게된다. 시그널핸들러내에서시그널받는것을금지하지않는다. 즉, 마스크를사용하지않는다. sigaction 실행결과 : 프로그램실행도중 ^C 로시그널을보낸다.

8 sigprocmask 시그널집합단위로봉쇄될시그널목록설정 프로세스가대단히중요한코드를실행중일때작업에방해를받지않기위해시그널을무시할수도있다. #include <signal.h> int sigprocmask (int how, const sigset_t *set, sigset_t *oldset); how set oldset 반환값 sigprocmask 함수의행동방식을결정새롭게적용하는시그널마스크이전에적용되어있는시그널마스크를저장호출이성공할경우 0을반환하고, 실패하면 -1을반환한다. 시그널봉쇄 중요한작업수행 시그널봉쇄해제 how 값 SIG_BLOCK SIG_UNBLOCK SIG_SETMASK sigprocmask 의미현재봉쇄설정된시그널의목록에두번째인자 set에포함된시그널을추가한다. 현재봉쇄설정된시그널의목록에서두번째인자 set에포함된시그널을제외한다. 현재봉쇄설정된시그널의목록을두번째인자 set가가진목록으로대체한다.

9 sigprocmask 실행결과 : 프로그램실행도중 ^C 로시그널을보낸다. kill/raise 프로세스에시그널전달 kill: 특정프로세스나프로세스그룹에게지정한시그널을전달 raise: 자기자신에게지정한시그널을전달한다. #include <sys/types.h> #include <signal.h> int kill (pid_t pid, int sig); #include <signal.h> int raise (int sig); pid sig 반환값 프로세스의식별번호시그널번호호출이성공하면 0을반환, 실패하면 -1을반환

10 kill/raise kill 에서 pid 값에따른의미 pid pid > 0 pid = 0 pid = -1 pid < -1 의미 특정프로세스에시그널전달자신과같은그룹에있는모든프로세스에시그널전달시그널전달이허용된모든프로세스에시그널전달. 단, 프로세스식별번호가 1인프로세스 (init) 는제외. 프로세스그룹식별번호가 -pid인모든프로세스에게시그널전달 raise 는 kill 의특정한형태 raise(sig); kill (getpid(), sig); alarm 지정한시간이경과한후자신에게 SIGALRM 시그널을보낸다. #include <unistd.h> unsigned int alarm (unsigned int seconds); seconds 반환값 초단위의시간지정한시간중남은시간을반환한다. 0 이상의값이다. alarm 설정은한번에하나만등록할수있다. 여러개를누적해서등록할수없다. 마지막에등록한하나의 alarm 만유효하다. 이전에등록된 alarm 은취소된다. 지금까지사용했던 sleep 함수는 alarm 을사용하여구현되었다. sleep 과 alarm 은함께사용하지않는것이좋다.

11 alarm 실행결과 pause 시그널이전달될때까지대기 #include <unistd.h> int pause(void); 반환값 항상 -1 을반환 아무시그널이나상관없다. 수신된시그널이프로세스를종료시키는것이라면프로세스는 pause 상태에서벗어나자마자종료된다. 무시하도록설정된시그널에대해서는반응하지않는다. 시그널핸들러가등록된시그널이라면시그널핸들러를실행하고나서 pause 상태를벗어난다.

12 pause 실행결과 : 프로그램실행도중 ^C 로시그널을보낸다. 예제 처리할시그널수 시그널추가및핸들러설정 SIGUSR1 제한 flag 가 0 이될때까지 1 초간격으로출력

13 예제 SIGUSR1 을자신에게전달. 효과는? 각시그널에대해번호를출력