
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 itself
SIGINT :
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) :
signal은 UNIX가 개발되었을 때부터 사용되었던 오래된 system call임.
sigaction(2) :



SIGINT(ctrl + C), SIGQUIT(ctrl + \) 에 대한 signal handler 등록하기


SIGALRM signal에 대한 handler 등록하기


sigprocmask(2) :

sigpending(2) :
현재 pending되고 있는 signal이 무엇이 있는지 set에 반환.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) :
지정한 시간이 지나면, SIGALRM signal이 들어온다.
sleep(3) :
nanosleep(2) :
만약 1초 100ms를 sleep하고 싶다면,간단하게 정리하자면
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를 확인할 수 있다.