시스템에서 커널의 내부적 이벤트와 연관된 process에게 신호를 전달
process입장에서 비동기적으로 전달받고 이벤트를 handling하는 메커니즘을 동작시킨다. --> signal handling
User's View
자신이 프로그램이 실행되다 signal을 받으면 멈추고 signal을 처리하는 handler를 수행
handler가 없으면 default 핸들러가 실행된다.
signal에 따라 프로그램 종료를 하거나 signal을 처리하고 다시 이어서 실행한다.
Kernel's View
- kernel은 여러 signal이 있다.
- signal이벤트가 발생하면 해당 event가 발생했다는 것을 check한다.
- 이벤트와 연관된 process의 control block에 signal 체크한다.
- 해당 signal의 signal핸들러로 jump한다.
- 종료하거나 resume한다.
- 커널에서 전달받거나 다른 user에서 전달받는다
signal이 핸들링 되는 과정
- signal이 발생이 되어있을 경우 pcb에 pendding이 된다. //process에게 전달
- 유저 프로그램이 커널모드에서 running 될 때 실행될 때 처리된다.
singal이 handler에서 처리된다
- 처리되지 않는 signal을 pending signal이라고한다
- signal이 임시적으로 blocked되면 signal blocking 이라 부른다.
instruction m을 수행하는 도중에 signal이 전달 되면 instruction이 마무리하고 signal에 대해 kernel이 default handler 또는 설정된 handler를 call한다.
signal핸들러를 수행해주는 방식
1. defualt handler (SIG_DFL)
handler가 등록되어 있지 않은 경우 보통 error를 커널에서 보내는 경우가 많아서 기본적이 handler로 처리한다. 대부분 문제점 출력하고 종료되도록한다.
2. ignore a signal(SIG_IGN)
무시할 수 있는건 하고 아니면 무시 안한다.
3. user defien signal
유저가 등록한다.
signal 종류와 원인, 처리
- SIGABRT
abort 발생했을때 / 6 / Core-dump & exit (core dump 출력하고 종료)
- SIGALRM
alarm /14 / Exit (종료)
- SIGBUS
Bus error 메모리를 잘못했을 때 / 7 / Core-dump & exit ( dump출력하고 종료 )
- SIGCHLD
자식이 종료되었을 때 / 17 / Ignore(무시)
- SIGCONT
중단된 프로세스가 continue하라하는 / 18 / Restart/Ignore (재시작 or 무시)
- SIGEMT
trap이 발생했을 때 / - / Core-dump & exit (core dump 출력하고 종료)
- SIGFPE
arithmetic excepton /8 / Core-dump & exit (core dump 출력하고 종료)
- SIGHUP
consol과 연결이 끊겼다 / 1 / Exit (종료)
- SIGILL
불법의 명령어 Not an instruction (an illegal jump to a data section) / 4 / Core-dump & exit (core dump 출력하고 종료)
- SIGINT
control C / 2 / Exit (종료)
- SIGIO
Asynchronous I/O done (I/O가 마무리 되었을 때) / 29 / Exit (종료)
- SIGIOT
H/W fault (SIGABRT와 유사, abort 발생했을 때) / 6 / Core-dump & exit
- SIGKILL
immediate kill request (kill (9)) : / 9 / Exit (종료)
- SIGPIPE
Write attempt to a pipe with no reader (broken pipe) (reader가 없는 pipe에 write시도) / 13 / Exit (종료)
- SIGPOLL
A pollable event occurred in I/O (poll()) (I/O에서 polling이 가능한 이벤트 발생) / 29 / Exit (종료)
- SIGPROF
Profiling timer expired / 27 / Exit (종료)
- SIGPWR
Power failure / 30 / Ignore
- SIGQUIT
control Z, quit / 3 / Core-dump & exit (core dump 출력하고 종료)
- SIGSEGV
illegal memory access (pointer, access kernel’s or other process’s area, write on read-only area) / 11 / Core-dump & exit (core dump 출력하고 종료)
- SIGSTOP
Stop (ex: debugger) / 19 / Stop (정지)
- SIGSYS
Illegal system call / 31 / Core-dump & exit
- SIGTERM
kill (15) : safe process termination / 15 / Exit
- SIGTRAP
Trace/Breakpoint Trap / 5 / Core-dump & exit (core dump 출력하고 종료)
- SIGTSTP
control Z / 20 / Stop
- SIGTTIN
A background attempts reading / 21 / Stop
- SIGTTOU
A background attempts writing / 22 / Stop
- SIGURG
An urgent socket event / 23 / Ignore
- SIGUSR1
User defined signal 1 / 10 / Exit
- SIGUSR2
User defined signal 2 / 12 / Exit
- SIGVTALRM
Virtual timer alarm / 26 / Exit
- SIGWINCH
Size change in a tty window / 28 / Ignore
- SIGXCPU
CPU time-limit expire / 24 / Core-dump & exit (core dump 출력하고 종료)
- SIGXFSZ
File size-limit violation / 25 / Core-dump & exit
#include <signal.h>
typedef void(*sighandler_t)(int); // void function pointer
sighandler_t signal(int signum, sighandler_t handler);
발생된 signal을 처리하는 signal핸들러를 등록하는 함수 처리할 동작의 함수가 미리 정의되어 있어야한다. 일반적으로 한번만 실행된다. 다음부터는 동일한 signal에서 default handler가 실행된다. signal 다시 등록해야한다. singnal(SIGINT,was); |
signum : signal number handler : 등록할 핸들러 |
return 이전의 핸들러 주소 / SIG_ERR에러를 |
sighandler.c
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid, int sig);
signal을 (보내는)발생시키는 함수 |
pid : 여기로 process id 0> :해당 process pid / 0 : 해당 group의 모든 process / -1 : init process를 제외한 다른모든 process sig : signal number 이걸 발생 |
return 0/ -1 |
kill.c
#include <signal.h>
int raise (int sig)
자기자신에게 signal을 보낸다 |
sig : signal number |
return 0/-1 |
#incldue <unistd.h>
unsigned alarm(unsigned sec);
sec후에 자기자신에서 SIGALRM 보낸다. linux는 한번에 한개만, 이전에 있었으면 이전 알람들은 cancel한다. |
sec:초단위 숫자 |
return 이전에 알람이 있었으면 남은시간 / 알람이 처음이다 0 |
alarm.c
#include <stdlib.h>
void abort(void);
abort signal을 생성한다. -> core dump and exit한다. core dump는 발생하면 파일형태로 기제를 해주는 것이 실행된다. 어디에 기제되는 것을 살펴봐야한다. core dump는 문제 정보 출력해주는거 |
#incldue<unistd.h>
int pause(void);
어떤 singal이와도 자기에게 전달될 때 까지 기다리는 system call |
return - default핸들러에 의해서 signal이 실행되면 바로 종료 - user define 핸들러로 실행되면 handler가 invoked된 후로 실행된다. |
pause.c
'시스템 프로그래밍' 카테고리의 다른 글
시스템 프로그래밍 11장 - Timer (0) | 2020.06.11 |
---|---|
시스템 프로그래밍 10장 - Signal 2 (0) | 2020.06.11 |
시스템 프로그램 9장 - Semaphore (0) | 2020.06.10 |
시스템 프로그래밍 8장 - Memory 1 (0) | 2020.06.10 |
시스템 프로그래밍 7장 - Record Lock (0) | 2020.05.06 |