😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[ν”„λ‘œμ„ΈμŠ€μ™€ μ‹œκ·Έλ„] μ‹œκ·Έλ„ (Signal) λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Raspberry Pi

[ν”„λ‘œμ„ΈμŠ€μ™€ μ‹œκ·Έλ„] μ‹œκ·Έλ„ (Signal)

μ§•μ§•μ•ŒνŒŒμΉ΄ 2024. 1. 9. 15:32
728x90
λ°˜μ‘ν˜•

<μ„œμ˜μ§„ λ‹˜μ˜ 사물인터넷을 μœ„ν•œ λ¦¬λˆ…μŠ€ ν”„λ‘œκ·Έλž˜λ° 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

728x90
λ°˜μ‘ν˜•
Comments