ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
๋ฐ์ํ
Signal
- ์ธํฐ๋ฝํธ๋ ์ธ์ ๋ฐ์ํ ์ง ์ ์ ์๋ค.
- ๋ฐ๋ผ์ ์ด๋ฅผ ๋น๋๊ธฐ์ (Asynchronous) ์ด๋ฒคํธ๋ผ๊ณ ํ๋ฉฐ, ์๊ทธ๋์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ค.
- ์ธํฐ๋ฝํธ๋ ํฌ๊ฒ H/W, S/W ์ธํฐ๋ฝํธ๋ก ๋๋๋ค.
- ์๊ทธ๋์ S/W ์ธํฐ๋ฝํธ์ด๋ค.
- ์๊ทธ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋๋ผ๋, ์๊ทธ๋์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ ์ํ์ง ์์ผ๋ฉด ๋ฌด์๋๋ค.
- ๋จ `SIGKILL`, `SIGSTOP`์ ๋ฌด์ํ ์ ์๋ค.
- ์๊ทธ๋์ ์ข ๋ฅ๋ `kill -l`์ ํตํด ํ์ธํ ์ ์๋ค.
- fork, exec์ ๋ฐ๋ผ ์๊ทธ๋์ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
- fork๋ฅผ ํ๊ฒ ๋๋ฉด ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๊ทธ๋ก ๋ณต์ ํ๋ฏ๋ก, ๋์ผํ ์๊ทธ๋์ ์์๋ฐ๋๋ค.
- exec์ ๊ฒฝ์ฐ SIGTERM์ ์์๋ฐ์ง ์๋๋ค.
SIGKILL
#!/bin/bash
if [ -z $1 ]; then
echo "Usage: ./kill_process <Process Name>"
exit
fi
PID=ps -eaf | grep $1 | grep -v grep | awk '{printf $2}'
if [[ "" != "$PID" ]]; then
kill -9 $PID
fi
์์ ๊ฐ์ด shell์ ์์ฑํ๋ฉด, ํน์ ์ด๋ฆ์ผ๋ก ๋์ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ์ํฌ ์ ์๋ค.
Signal Handler
#include <signal.h>
int term_proc;
void signal_handler(int sig_num)
{
term_proc = 1;
}
int main()
{
// fork
signal(SIGTERM, signal_handler)
while(!term_proc)
{
// ์ฒ๋ฆฌํ ๋์
}
}
์ผ๋ฐ์ ์ผ๋ก kill [pid]๋ฅผ ์ ๋ ฅํ๋ฉด `kill -15`, ์ฆ SIGTERM๊ณผ ๊ฐ๋ค. ๋ฐ๋ผ์, SIGTERM์ ๋ํ ์๊ทธ๋ ํธ๋ค๋ฌ๋ฅผ ๋ง๋ค๋ฉด ์ ์์ ์ผ๋ก ์ค๋จํ ์ ์๋ค. ์์ ์ฝ๋์ ๊ฐ์ด ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ํ๋ก์ธ์ค๋ฅผ ์ง์์ ์ผ๋ก ๋์์ํค๊ธฐ ์ํด while๋ฌธ์ ์คํํ๊ฒ ๋๋ค. ์ด๋ while๋ฌธ์ ์กฐ๊ฑด์ signal์ ๋ฐ๋ผ ๋ณ๊ฒฝํ๋๋ก ํ๋ฉด, kill์ ํตํด์ ์์ฑํ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ์ ์๋ค.
(signal ํจ์์ ์ธ์๋ ์๊ทธ๋์ ์ข ๋ฅ์ ์ด๋ฅผ ์ฒ๋ฆฌํ ํจ์์ ์์ ์ฃผ์์ด๋ค.)
728x90
๋ฐ์ํ
'๐โโ๏ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C: IPC (0) | 2021.06.13 |
---|---|
C: ํ์ผ ๋ค๋ฃจ๊ธฐ (0) | 2021.06.12 |
C: thread safe and reentrant (0) | 2021.01.26 |
C: Memory Layout of C Programs (0) | 2021.01.26 |
C: Storage class specifier (0) | 2020.11.27 |
๋๊ธ
๊ธ ๋ณด๊ดํจ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ