Signal
: are SW interrupts and provide a way to handle asynchronous events
(비동기식 프로그램을 수행하기 위한 하나의 수단..)
HW는 clock에 의해 동기적으로 수행, SW는 왜 비동기적인가?
OS에서 HW를 추상화시키기 때문에 우리가 program을 짤 때, clock의 개념이 사라진다.
Signal이 발생하면, 그 Signal은 해당 Process에게 전달되고,
그 process는 signal에 대한 action을 취한다.
ignore it
: 하지만 몇몇 signal은 무시되지 못함catch it
: Signal handler를 호출하여 처리accept the default
Core
: Core dumpStop
: 일시 정지Cont
: 재개Term
: 종료Ign
: 무시SIGALRM
: 특정 시간이 지나면 알람SIGCHILD
: child process가 끝나면 parent process한테 가는 signalSIGCONT
: process가 중지되어 있을 경우, 재개SIGSEGV
: 잘못된 memory 접근SIGSTOP
: process 일시 정지 (= Ctrl + Z)SIGTERM
: process 종료 (= Ctrl + C)SIGKILL
, SIGSTOP
kill(2)
:raise(3)
: sends a signal to itselfSIGINT
:Ctrl + C
:SIGSTOP
:Ctrl + Z
:SIGQUIT
:
Ctrl + \
:
kill -SIGKILL <pid>
:
kill -9 <pid>
:
gdb
: The GNU Debuggergcc -g
: debug용으로 compile하는 옵션gdb ./(실행파일)
break = b
: breakpoint 설정r : 실행
n : 한줄씩 실행
/ 그냥 enter : 이전 명령어(n) 실행step = s : 해당 함수로 들어가라
list = l : 현재 어디에 있는지 확인하기
backtrace
:Ctrl + d
: debugger 종료signal(2)
:sigaction(2)
:SIGINT(ctrl + C), SIGQUIT(ctrl + \) 에 대한 signal handler 등록하기
SIGALRM signal에 대한 handler 등록하기
sigprocmask(2)
:sigpending(2)
:sigaction example 1
:
➡️ Ctrl+C를 여러번 눌러도 딱 하나만 pending된다.
sigaction example 2
:
왜 (0, 1) 또는 (1, 0)이라는 값이 들어갈까?
구조체끼리 대입 연산을 할 때, 실제로 한번에 연산되는 것이 아니라
machine code를 보면 구조체 안에 있는 변수를 각각 대입한다.
예를 들어
0 0인 상태에서 1 1을 대입하려고 할 때,
1 0, 1 1 이러한 순서로 대입이 된다.
하지만 1 0에서 alarm이 오면 끊고나서, 1 1이 들어가지 않고 1 0이 들어가는 상황이 생기게 된다.
마찬가지로 반대의 경우 0 1도...
이러한 오류를 막기 위해서 sigprocmask()를 통해 구조체끼리 대입 연산을 하는 동안 signal을 받지 않도록 해야 한다.
alarm(2)
:sleep(3)
:nanosleep(2)
:간단하게 정리하자면
sigaction(2)은 기존의 Signal에 대한 action을 다르게 지정할 수 있는 system call.
sigprocmask(2)는 특정 signal이 들어오는 것을 blocking할 수 있는 system call.
core dump file 생성을 허가
하고, 크기를 제한하고 싶다면 다음 명령어를 사용한다.ulimit -c unlimited
이제 core dump file을 생성할 수 있고, 만들어지는 크기는 제한이 없다.
core dump file을 생성
해보자./mnt/wslg/dumps
밑에 만들어진다고 한다./var/lib/apport/coredump/
밑에 만들어졌다.gdb [원래실행파일명] [만들어진 core dump file명]
SIGQUIT signal로 인해 program이 종료되었다는 msg를 확인할 수 있다.