π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[νλ‘μΈμ€μ μκ·Έλ] μκ·Έλ (Signal) λ³Έλ¬Έ
[νλ‘μΈμ€μ μκ·Έλ] μκ·Έλ (Signal)
μ§μ§μνμΉ΄ 2024. 1. 9. 15:32<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° with λΌμ¦λ² 리νμ΄ μμ μ μ°Έκ³ ν΄μ μμ±νμμ΅λλ€ :-)>
βμκ·Έλ
νλ‘μΈμ€λ€ μ¬μ΄μμ λΉλκΈ°μ (Asynchronous) μ¬κ±΄μ λ°μμ μ λ¬νλ λ°©λ²
μννΈμ¨μ΄μ μΈ μΈν°λ½νΈ (Interrupt)
μ΄μ체μ μμ μΈν°λ½νΈλ₯Ό μλ―Ένλ μκ·Έλμ΄ λ°μν΄μ νμ¬ μ€ν μ€μΈ νλ‘κ·Έλ¨μ μ λ¬μ΄ λκ³ , ν΄λΉ μκ·Έλμ λ°μ νλ‘κ·Έλ¨μ μ’ λ£λλ€
μκ·Έλμ νλ‘κ·Έλ¨μκ² λ¬΄μΈκ° μ¬κ±΄μ μ λ¬νκΈ° μν΄ μ¬μ©λλ€
λλΆλΆμ μκ·Έλμ΄ SIGINT, SIGABRT, SIGALRM λ± SIG μΌλ‘ μμνλ μ΄λ¦μ κ°μ§λ€
νλ‘μΈμ€λ λ€λ₯Έ νλ‘μΈμ€μ μκ·Έλμ μ λ¬/μ€μ κ°λ₯
ν΄λΉ νλ‘μΈμ€λ λΉλκΈ°μ μΌλ‘ μκ·Έλμ λ°μμ μ²λ¦¬ν μ μλ€
SIGCONT μκ·Έλμ κ°μ μΈμ μ μλ μμμ νλ‘μΈμ€μκ² μ λ¬
SIGURG μκ·Έλμ TCP/IP λ€νΈμν¬ OOB(Out Of Band) λ©μμ§ ν΅ν΄μ μ λ¬
βοΈ μκ·Έλ λ§μ€ν¬μ sigprocmask() ν¨μ
μκ·Έλ λ§μ€ν¬λ μΌμ’ μ νν° (filter) λ‘ ν΄λΉ μκ·Έλμ λν λ§μ€ν¬λ₯Ό μ¬μ©νλ©΄ λ§μ€νΉλ μκ·Έλμ ν΄λΉ νλ‘μΈμ€λ‘ μ λ¬λμ§ μλλ€
λ§μ½ νλ‘μΈμ€μμ ν΄λΉ μκ·Έλμ λ°κΈ°λ₯Ό μνλ κ²½μ° μ΄ μκ·Έλμ λν λ§μ€ν¬λ₯Ό μ κ±°νλ©΄ λΈλ‘λμ΄ μλ μκ·Έλμ λ§μ€ν¬κ° μ κ±°λ νλ‘μΈμ€λ‘ μ λ¬λλ€
리λ μ€μμ μκ·Έλ λ§μ€ν¬λ₯Ό λ€λ£¨κΈ° μν ν¨μλ€ μ 곡 -> sigset_t ν μκ·Έλ¬ μ μ΄μ©νλ€
β μκ·Έλλ‘ μ²λ¦¬νλ ν¨μ
νλμ sigHandler νΈλ€λ¬ μμ± + signal ν¨μ μ΄μ©ν΄μ μ¬λ¬ μκ·Έλμ μ²λ¦¬
SIGINT λ Ctrl + C ν€ λλ₯΄λ©΄ λ°μ
SIGUSR1 κ³Ό SIGUSR2 λ μ¬μ©μκ° λ°μνλ μκ·Έλ
μκ·Έλμ μ ν리μΌμ΄μ
μ μ΄λ²€νΈλ₯Ό μ λ¬νκΈ° μν΄ μ¬μ©λλ€
μ¬μ©μ μκ·ΈλμΈ SIGUSR1 κ³Ό SIGUSR2 λ kill λͺ
λ Ήμ΄ μ¬μ©ν΄μ μ λ¬νλ€
kill λͺ
λ Ήμ΄μ μ λ¬νλ €λ μκ·Έλ λ²νΈλ₯Ό μ§μ μ
λ ₯νκ³ μΆμ κ²½μ°μλ -s μ΅μ
μ¬μ©νλ€
λ°±κ·ΈλΌμ΄λ λͺ¨λλ‘ μ€ν΄λκ³ μλ μ ν리μΌμ΄μ
μ ν€λ³΄λ μ
λ ₯ λ°μ μ μμ
fg λͺ
λ Ήμ΄ μ΄μ©ν΄μ ν¬κ·ΈλΌμ΄λ λͺ¨λλ‘ μ ννμ¬ μ ν리μΌμ΄μ
μ μλ‘ ν¬κ·ΈλΌμ΄λμμ μ€νν ν
Ctrl + C ν€λ³΄λ λλ₯΄λ©΄ SIGINT μκ·Έλ μ λ¬ν΄μ μνλ μ²λ¦¬ μνν μ μλ€
SIGQUIT μ SIGRTMIN μκ·Έλμ sigprocsmask() ν¨μ ν΅ν΄μ λΈλ‘ μ²λ¦¬
SIGPIPE ν¨μλ signal() ν¨μ ν΅ν΄μ 무μνλλ‘ μ²λ¦¬
3κ°μ μκ·Έλμ΄ λ°ννλλΌλ μ ν리μΌμ΄μ
μ μ’
λ£λμ§ μκ³ λ³λ€λ₯Έ λ°μ 보μ΄μ§ μλλ€
μνΌ μ μ (root) λ μμμ νλ‘μΈμ€μκ² μκ·Έλ μ λ¬ κ°λ₯
μΌλ° μ μ μ κ²½μ°μλ μκ·Έλμ λ°μνλ νλ‘μΈμ€μ μ€μ /μ ν¨ μ¬μ©μ IDκ°
μκ·Έλμ μμ ν νλ‘μΈμ€μ μ€μ /μ ν¨ μ¬μ©μ ID μ λμν κ²½μ°μλ§ μκ·Έλ μ λ¬ κ°λ₯
μκ·Έλ μ λ¬λλ©΄ μ ν΄μ§ λ°©λ²λλ‘ μ²λ¦¬, λ°μλ μκ·Έλμ΄ μ λ¬λμ§ λͺ»νλ©΄ μ§μ°(pending) μν λ°μ
μκ·Έλμ΄ λΈλ‘λλ©΄ μκ·Έλμ λΈλ‘μ΄ ν΄μ§λκ±°λ 무μνλλ‘ λ³κ²½λ λκΉμ§ μ§μ°λ μνλ‘ λ¨μ μμ
λΈλ‘λ μκ·Έλμ μκ·Έλ λ§μ€ν¬μ μν΄μ κ΄λ¦¬λ¨
#include <stdio.h>
#include <signal.h> /* signal( ) ν¨μλ₯Ό μν΄ μ¬μ© */
#include <stdlib.h> /* exit( ) ν¨μλ₯Ό μν΄ μ¬μ© */
#include <string.h> /* strsignal() ν¨μλ₯Ό μν΄ μ¬μ© */
#include <unistd.h>
static void printSigset(sigset_t *set); /* νμ¬ sigset_tμ μ€μ λ μκ·Έλ νμ */
static void sigHandler(int); /* μκ·Έλ μ²λ¦¬μ© νΈλ€λ¬ */
int main(int argc, char **argv)
{
sigset_t pset; /* λΈλ‘ν μκ·Έλμ λ±λ‘ν sigset_t ν */
sigemptyset(&pset); /* λͺ¨λ 0μΌλ‘ μ€μ */
sigaddset(&pset, SIGQUIT); /* SIGQUITμ SIGRTMINμ μ€μ */
sigaddset(&pset, SIGRTMIN);
sigprocmask(SIG_BLOCK, &pset, NULL); /* νμ¬μ μκ·Έλ λ§μ€ν¬μ μΆκ° */
printSigset(&pset); /* νμ¬ μ€μ λ sigset_tλ₯Ό νλ©΄μΌλ‘ μΆλ ₯ */
if(signal(SIGINT, sigHandler) == SIG_ERR) { /* SIGINTμ μ²λ¦¬λ₯Ό μν νΈλ€λ¬ λ±λ‘ */
perror("signal() : SIGINT");
return -1;
}
if(signal(SIGUSR1, sigHandler) == SIG_ERR) { /* SIGUSR1 μ²λ¦¬λ₯Ό μν νΈλ€λ¬ λ±λ‘ */
perror("signal() : SIGUSR1");
return -1;
}
if(signal(SIGUSR2, sigHandler) == SIG_ERR) { /* SIGUSR2 μ²λ¦¬λ₯Ό μν νΈλ€λ¬ λ±λ‘ */
perror("signal() : SIGUSR2");
return -1;
}
if(signal(SIGPIPE, SIG_IGN) == SIG_ERR) { /* SIGPIPE μ²λ¦¬λ₯Ό μν νΈλ€λ¬ λ±λ‘ */
perror("signal() : SIGPIPE");
return -1;
}
while(1) pause(); /* μκ·Έλ μ²λ¦¬λ₯Ό μν΄ λκΈ° */
return 0;
}
static void sigHandler(int signo) /* μκ·Έλ λ²νΈλ₯Ό μΈμλ‘ λ°λλ€. */
{
if(signo == SIGINT) { /* SIGINT μκ·Έλμ΄ λ°μνμ λ μ²λ¦¬ */
printf("SIGINT is catched : %d\n", signo);
exit(0);
} else if(signo == SIGUSR1) { /* SIGUSR1 μκ·Έλμ΄ λ°μνμ λ μ²λ¦¬ */
printf("SIGUSR1 is catched\n");
} else if(signo == SIGUSR2) { /* SIGUSR2 μκ·Έλμ΄ λ°μνμ λ μ²λ¦¬ */
printf("SIGUSR2 is catched\n");
} else if(signo == SIGQUIT) {
printf("SIGQUIT is catched\n");
sigset_t uset;
sigemptyset(&uset);
sigaddset(&uset, SIGINT);
sigprocmask(SIG_UNBLOCK, &uset, NULL);
} else {
fprintf(stderr, "Catched signal : %s\n", strsignal(signo));
}
}
static void printSigset(sigset_t *set)
{
int i;
for(i = 1; i < NSIG; ++i) { /* sigset_tμ μ€μ λ μ 체 λΉνΈλ₯Ό μΆλ ₯ */
printf((sigismember(set, i))?"1":"0");
}
putchar('\n');
}
/*
νλμ sigHandler νΈλ€λ¬ μμ± + signal ν¨μ μ΄μ©ν΄μ μ¬λ¬ μκ·Έλμ μ²λ¦¬
SIGINT λ Ctrl + C ν€ λλ₯΄λ©΄ λ°μ
SIGUSR1 κ³Ό SIGUSR2 λ μ¬μ©μκ° λ°μνλ μκ·Έλ
μκ·Έλμ μ ν리μΌμ΄μ
μ μ΄λ²€νΈλ₯Ό μ λ¬νκΈ° μν΄ μ¬μ©λλ€
μ¬μ©μ μκ·ΈλμΈ SIGUSR1 κ³Ό SIGUSR2 λ kill λͺ
λ Ήμ΄ μ¬μ©ν΄μ μ λ¬νλ€
kill λͺ
λ Ήμ΄μ μ λ¬νλ €λ μκ·Έλ λ²νΈλ₯Ό μ§μ μ
λ ₯νκ³ μΆμ κ²½μ°μλ -s μ΅μ
μ¬μ©νλ€
λ°±κ·ΈλΌμ΄λ λͺ¨λλ‘ μ€ν΄λκ³ μλ μ ν리μΌμ΄μ
μ ν€λ³΄λ μ
λ ₯ λ°μ μ μμ
fg λͺ
λ Ήμ΄ μ΄μ©ν΄μ ν¬κ·ΈλΌμ΄λ λͺ¨λλ‘ μ ννμ¬ μ ν리μΌμ΄μ
μ μλ‘ ν¬κ·ΈλΌμ΄λμμ μ€νν ν
Ctrl + C ν€λ³΄λ λλ₯΄λ©΄ SIGINT μκ·Έλ μ λ¬ν΄μ μνλ μ²λ¦¬ μνν μ μλ€
SIGQUIT μ SIGRTMIN μκ·Έλμ sigprocsmask) ν¨μ ν΅ν΄μ λΈλ‘ μ²λ¦¬
ISGPIPE ν¨μλ signal() ν¨μ ν΅ν΄μ 무μνλλ‘ μ²λ¦¬
3κ°μ μκ·Έλμ΄ λ°ννλλΌλ μ ν리μΌμ΄μ
μ μ’
λ£λμ§ μκ³ λ³λ€λ₯Έ λ°μ 보μ΄μ§ μλλ€
μνΌ μ μ (root) λ μμμ νλ‘μΈμ€μκ² μκ·Έλ μ λ¬ κ°λ₯
μΌλ° μ μ μ κ²½μ°μλ μκ·Έλμ λ°μνλ νλ‘μΈμ€μ μ€μ /μ ν¨ μ¬μ©μ IDκ°
μκ·Έλμ μμ ν νλ‘μΈμ€μ μ€μ /μ ν¨ μ¬μ©μ ID μ λμν κ²½μ°μλ§ μκ·Έλ μ λ¬ κ°λ₯
μκ·Έλ μ λ¬λλ©΄ μ ν΄μ§ λ°©λ²λλ‘ μ²λ¦¬, λ°μλ μκ·Έλμ΄ μ λ¬λμ§ λͺ»νλ©΄ μ§μ°(pending) μν λ°μ
μκ·Έλμ΄ λΈλ‘λλ©΄ μκ·Έλμ λΈλ‘μ΄ ν΄μ§λκ±°λ 무μνλλ‘ λ³κ²½λ λκΉμ§ μ§μ°λ μνλ‘ λ¨μ μμ
λΈλ‘λ μκ·Έλμ μκ·Έλ λ§μ€ν¬μ μν΄μ κ΄λ¦¬λ¨
gani@gani:~/raspi/Process_Signal $ ./handleSignal &
[2] 9803
0010000000000000000000000000000001000000000000000000000000000000
gani@gani:~/raspi/Process_Signal $ kill -USR1 9803
SIGUSR1 is catched
gani@gani:~/raspi/Process_Signal $ kill -USR2 9803
SIGUSR2 is catched
gani@gani:~/raspi/Process_Signal $ ./handleSignal
0010000000000000000000000000000001000000000000000000000000000000
^CSIGINT is catched : 2
gani@gani:~/raspi/Process_Signal $ kill -s SIGPIPE 9803
gani@gani:~/raspi/Process_Signal $ kill -s SIGQUIT 9803
gani@gani:~/raspi/Process_Signal $ kill -s SIGTERM 9803
[2]+ μ’
λ£λ¨ ./handleSignal
*/
gcc -o handleSignal handleSingal.c
./handleSignal &
kill -USR1 9803
kill -USR2 9803
./handleSignal
kill -s SIGPIPE 9803
kill -s SIGQUIT 9803
kill -s SIGTERM 9803