signal ´Ù·ç±â 3
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>signal ´Ù·ç±â 3



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

½Ã±×³ÎÀÇ Æ¯Â¡ : ½Ã±×³ÎÀº ´ë±â¿­ÀÌ ¾ø´Ù

½Ã±×³ÎÀº ÇÑ ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼­ ¹ß»ýÇÏ´Â ½Ã±×³ÎÀ» Å¥À× ÇÏÁö ¸øÇÑ´Ù(´ëºÎºÐÀÇ À¯´Ð½º). ƯÁ¤ ÇÁ·Î¼¼½º¿¡ º¸³»´Â ½Ã±×³ÎÀº Ä¿³Î¿¡¼­ °ü¸®Çϴµ¥ À̶§ Ä¿³ÎÀº ÇÁ·Î¼¼½º¿¡°Ô º¸³¾ ½Ã±×³ÎÀ» ÇѰ³ ÀÌ»ó À¯ÁöÇÒ¼ö ¾ø´Ù.

½Ã±×³ÎÀ» ¹Þ°Ô µÇ¸é, ÇÁ·Î¼¼½º´Â ½Ã±×³Î Çڵ鷯(½ÅÈ£ 󸮱â)¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³Î¿¡ ´ëÇÑ Ã³¸®¸¦ ÇÏ°Ô µÈ´Ù. À̶§ Áï ½Ã±×³Î ¿¡ ´ëÇÑ Ã³¸®°¡ ³¡³ªÁö ¾ÊÀº »óÅ¿¡¼­ ½Ã±×³ÎÀÌ ¹ß»ýµÇ¸é ¾î¶»°Ô µÉ±î ?

½Ã±×³Î ó¸®Áß µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ µé¾î¿Â´Ù¸é ÀÌ ½Ã±×³ÎÀº ºí·°(º¸·ù)µÇ¾ú´Ù°¡ Çڵ鷯°¡ 󸮸¦ ³¡³ª¸é ¹Ù·Î Àü´ÞµÈ´Ù. ÀÌÀ¯´Â ½Ã±×³Î ÀÌ ¹ß»ýµÇ¾î¼­ ÇØ´ç ½Ã±×³Î¿¡ ´ëÇÑ Çڵ鷯°¡ ½ÇÇàµÇ¸é, Çڵ鷯 ½ÇÇàÀÌ Á¾·áµÇ±â±îÁö ¹ß»ýµÈ ½Ã±×³Î¿¡ ´ëÇØ¼­ block À» Çϱ⠶§¹®ÀÌ´Ù. ±×·±µ¥ µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ 2°³°¡ ¹ß»ýÀ» ÇÑ´Ù¸é?
Ä¿³ÎÀº ½Ã±×³ÎÀÇ ´ë±â¿­À» À¯ÁöÇÒ¼ö ¾øÀ¸¹Ç·Î ¸¶Áö¸·¿¡ µµÂøÇÑ ½Ã±×³ÎÀº »ç¶óÁö°Ô µÈ´Ù.

¸¸¾à ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³ÎÀÌ ¹ß»ýÇÑ´Ù¸é, ±× Áï½Ã ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù. ±âÁ¸ ½Ã±×³Î Çڵ鷯°¡ ÀÛ¾÷ÁßÀÌ´ø ¸»´ø ±× ½ÃÁ¡¿¡¼­ »õ·Î¿î ½Ã±×³ÎÀ» ¹Þ¾ÆµéÀ̰í, Çڵ鷯¸¦ ºüÁ®³ª°¡°Ô µÈ´Ù. ±×¸®°í ´Ù½Ã º¹±ÍÇÏÁö ¾Ê´Â´Ù.

±×·³ ½Ã±×³ÎÀº ½Å·ÚÇϱâ Èûµé°Ú±º¿ä?

½Ã±×³ÎÀÌ Å¥À× µÇÁö ¾Ê´Â´Ù´Â Á¡Àº ªÀº ½Ã°£¿¡ ¿©·¯°³ÀÇ ½Ã±×³ÎÀÌ ¹ß»ýÇÒ¶§ ½Ã±×³ÎÀ» ÀÒ¾î¹ö¸±¼öµµ ÀÖ´Ù¶ó´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¹°·Ð ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼­ ¸Å¿ì ªÀº ½Ã°£¿¡ ½Ã±×³ÎÀÌ ´Ù¼ö ¹ß»ýÇÏ´Â ÀÏÀº ±×¸® ÈçÇÏÁö ¾Ê±ä ÇϰÚÁö¸¸ °¡²ûÀº ¹®Á¦°¡ µÉ¼ÒÁö°¡ ÀÖ´Ù. ¿ì¸®°¡ ÀÏ¹Ý ½Ã±×³ÎÀÌ Å¥À× µÇµµ·Ï Ä¿³ÎÀ» ¶â¾î °íÄ¥¼ö´Â ¾ø´Â ¹®Á¦À̹ǷÎ, ÀÌ°É ¿Ïº®ÇÏ°Ô ÇØ°áÇÒ¼ö´Â ¾ø´Ù. ±×·¯³ª Çڵ鷯¸¦ ÃÖ¼ÒÇÑ ¾ÆÅä¹Í ÇÑ ÄÚµå·Î ¸¸µëÀ¸·Î½á ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ¹ß»ýÀ» ÁÙÀϼö´Â ÀÖÀ»°ÍÀÌ´Ù. ±×·¸Áö ¾Ê°í Ä¿³ÎÂ÷¿ø¿¡¼­ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇϰíÀÚ ÇÑ´Ù¸é ¸®¾óŸÀÓ ½Ã±×³ÎÀ» »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù.

°¡Àå Å« ¹®Á¦´Â ½Ã±×³ÎÇڵ鷯 ó¸®Áß¿¡ ´Ù¸¥ Á¾·ùÀÇ ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ»¶§ÀÌ´Ù. À§¿¡¼­ ¸»ÇßµíÀÌ ÀÌ·²°æ¿ì Çڵ鷯 󸮵µÁß¿¡ ºüÁ®³ª°¡°Ô µÇ°í, ´Ù½Ã Çڵ鷯·Î º¹±ÍÇÏÁö ¾Ê°Ô µÈ´Ù. ÀÌ°Ç ²Ï ½É°¢ÇÒ¼ö Àִµ¥, ½Ã±×³ÎÀ» ¹Þ¾Æ¼­ ¾î¶°ÇÑ ÆÄÀÏ ÀÛ¾÷À» Çϰí Àִµ¥, µµÁß¿¡ ´Ù¸¥ ½Ã±×³ÎÀÌ µé¾î¿Í ¹ö¸®¸é, Á¦´ë·ÎµÈ ÆÄÀÏÀÛ¾÷°á°ú¸¦ º¸ÁõÇÒ¼ö ¾øÀ»°ÍÀÌ´Ù.

´ÙÇàÈ÷ Unix ¿¡¼­´Â À§ÀÇ ¹®Á¦µéÀ» ÇØ°áÇÒ¼ö ÀÖ´Â ½Ã±×³Î Á¦¾î °ü·Ã ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. À̹®¼­ÀÇ µÞºÎºÐ¿¡¼­ ÀÌ¿¡ ´ëÇÑ ³»¿ëÀ» ´Ù·ç°Ô µÉ°ÍÀÌ´Ù. ´ÙÀ½Àº ½Ã±×³ÎÀÇ ÀÌ·¯ÇÑ Æ¯Â¡À» Å×½ºÆ®Çϱâ À§ÇÑ ¿¹Á¦ ÄÚµåÀÌ´Ù.
¿¹Á¦: sigint.c
#include <signal.h> 
#include <stdio.h> 
#include <string.h> 

void sig_int();
void sig_usr();

int main()
{
    char buf[255];
    int i= 0;

    if ((signal(SIGINT, sig_int)) == SIG_ERR)
    {
        perror("signal setting error : ");
        exit(1);
    }
    if ((signal(SIGUSR2, sig_usr)) == SIG_ERR)
    {
        perror("signal setting error : ");
        exit(1);
    }

    while(1)
    {
        printf("%d\n", i);
        sleep(1);
        i++;
    }

}

void sig_int()
{
    fprintf(stderr, "SIGINT !!!!\n");
    sleep(5);
}

void sig_usr()
{
    fprintf(stderr, "SIGUSR !!!!\n");
}

À§ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇØ¼­ ½ÇÇàÀ» ½ÃÄѺ¸ÀÚ
[yundream@localhost test]# ./sigtest
1
2
3
ÀÌÁ¦ CTRL+C ¸¦ ÀÔ·ÂÇØ¼­ SIGINT ¸¦ ¹ß»ý½ÃÄѺ¸ÀÚ. ±×·¯¸é ÇÁ·Î¼¼½º´Â SIGINT ½ÅÈ£¸¦ ¹Þ°Ô µÇ°í ½Ã±×³ÎÇڵ鷯ÀÎ sig_int ¸¦ È£ÃâÇÒ°ÍÀÌ´Ù. sig_int ´Â "SIGINT !!!!\n" À» È£ÃâÇϰí 5Ãʵ¿¾È Àáµé°Ô µÇ´Âµ¥, À̶§ °è¼Ó ÇØ¼­ CTRL+C ¸¦ ÇÑ 10¹ø Á¤µµ ÀÔ·ÂÇØº¸ÀÚ. ±×·³ 5ÃÊÈÄ¿¡ ÇÁ·Î¼¼½º¿¡ ´Ù½Ã SIGINT °¡ ¹ß»ýÇÔÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ¿©±â¼­ ´Ù½Ã 5Ãʸ¦ ±â´Ù¸®¸é ½Ã±×³ÎÀÌ ´Ù½Ã Àü´ÞµÉ±î ? ¹°·Ð Àü´ÞµÇÁö ¾Ê´Â´Ù. ´ÜÁö °°Àº ½Ã±×³Î¿¡ ´ëÇØ¼­ Çѹø¿¡ ÇϳªÀÇ ½Ã±×³Î¸¸ block(´ë±â) ÇÒ¼ö Àֱ⠶§¹®¿¡, ³ª¸ÓÁö 9°³ÀÇ ½Ã±×³ÎÀº Àü¹« ¹«½ÃµÇ¾î ¹ö¸°´Ù.

±×·³ ÀÌÁ¦ sig_int Çڵ鷯¸¦ È£ÃâÇϰí ÀִµµÁß¿¡ SIGUSR2 ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ¸é ¾î¶»°Ô µÉ±î ? ÀÌ Å×½ºÆ®´Â ./sigtest ¸¦ ½ÇÇà½Ã۰í CTRL+C ¸¦ ÀÔ·Â SIGINT ¸¦ ¹ß»ý½Ã۰í, Çڵ鷯¸¦ È£ÃâÇÏ´Â Áß¿¡ ½©¿¡¼­ kill ¸í·ÉÀ» ½á¼­ sigtest ÀÇ pid ·Î SIGUSR2 ½Ã±×³ÎÀ» º¸³»¸é µÉ°ÍÀÌ´Ù.
[yundream@localhost test]# ps -aux | grep sigtest
yundream      2176  0.0  0.1  1348  344 pts/5    S    23:48   0:00 ./sigtest
[yundream@localhost test]# kill -SIGUSR2 2176 
¹°·Ð kill À» ÅëÇØ ½Ã±×³ÎÀ» ¹ß»ý½Ã۱â Àü¿¡ ./sigtest ¿¡¼­ SIGINT¸¦ ¹ß»ý½ÃÄÑ¾ß ÇÑ´Ù. À§¿Í °°ÀÌ ÇØ¼­ SIGUSR2 ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ¸é ¾î¶»°Ô µÉ±î ? sig_int Çڵ鷯°¡ ÀÛ¾÷À» ³¡³¾¶§ ±îÁö ±â´Ù¸®°í ³ª¼­ SIGUSR2 °¡ Àü´ÞµÉ±î ? ´äÀº ±× Áï½Ã Àü´ÞµÈ´Ù ÀÌ´Ù. sig_int Çڵ鷯°¡ ¼öÇàÁßÀÌ°Ç ¾Æ´Ï°Ç °ð¹Ù·Î SIGUSR2 °¡ Àü´ÞµÇ°í sig_usr Çڵ鷯°¡ ½ÇÇàµÊÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ¹®Á¦µéÀÇ ´ëÇÑ ÇØ¹ýÀº À̹®¼­ÀÇ µÞºÎºÐ¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.

signal °ü·ÅÇÔ¼ö

Áö±Ý±îÁö ½Ã±×³ÎÀÇ °³·ÐÀûÀÎ ¸éÀ» »ìÆìºÃÀ¸´Ï ½ÇÁ¦ ½Ã±×³ÎÀ» º¸³»°í/¹Þ°í/Á¦¾îÇϱâ À§ÇÑ ¾î¶² ÇÔ¼öµéÀÌ ÀÖ´ÂÁö »ìÆìº¸µµ·Ï ÇϰڴÙ.

½ÅÈ£ º¸³»±â ÇÔ¼ö

Unix ¿¡¼­´Â ´ÙÀ½°ú °°Àº ½ÅÈ£¸¦ º¸³»±â À§ÇÑ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
#include 
#include 

int kill(pid_t pid, int sig);
int raise(int sig);
kill Àº ÇÁ·Î¼¼½º ±×·ì ȤÀº ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³¾¶§ »ç¿ëµÈ´Ù. pid °¡ 0º¸´Ù Å« ¾ç¼öÀ̸é ÇØ´ç pid ¸¦ °¡Áö´Â ÇÁ·Î¼¼½º¿¡°Ô sig ½Ã±×³ÎÀ» º¸³»¸ç, pid °¡ 0À̸é ÇöÀç ÇÁ·Î¼¼½º°¡ ¼ÓÇÑ ÇÁ·Î¼¼½º ±×·ìÀÇ ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³ÎÀ» º¸³½´Ù. pid °¡ -1À̸é 1¹ø ÇÁ·Î¼¼½º¸¦ Á¦¿ÜÇÑ ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô, -1 º¸´Ù ÀÛÀ¸¸é ÀÚ½ÅÀÌ °¡Áö´Â ÇÁ·Î¼¼½º ±×·ìÀÇ ¸ðµç ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³ÎÀ» º¸³½´Ù.

raise ´Â ÀÚ±âÀڽſ¡°Ô sig ½Ã±×³ÎÀ» º¸³»´Âµ¥, kill(getpid(), sig)·Î µ¿ÀÏÇÑ ÀÏÀ» ÇÒ¼ö ÀÖ´Ù.

½ÅÈ£ Á¦¾î ÇÔ¼ö

Áö³­¹ø ±â»çÀÎ signal´Ù·ç±â(1)¿¡¼­ ¿¡Á¦ sig_hup.c ¸¦ ÄÄÆÄÀÏ ÇØ¼­ Å×½ºÆ® ÇØº¸¾Ò´Ù¸é »õ·Î execl µÈ ÇÁ·Î¼¼½º¿¡¼­´Â ½Ã±×³Î ÀÛµ¿ÀÌ Á¦´ë·Î µÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ÀÌÀ¯´Â ¿À´Ã ³»¿ëÀ» Á¶±Ý »ý°¢ÇØ º¸¸é¼­ Àоú´Ù¸é ÃæºÐÈ÷ ¾Ë¾Æ³¾¼ö ÀÖÀ»°ÍÀÌ´Ù. sig_hup ¿¡¼­ SIGHUP½Ã±×³ÎÀ» Àü´Þ¹Þ¾Æ sig_handler ¸¦ ½ÇÇà½Ã۸é, Çڵ鷯°¡ ³¡³ª±â Àü°¡Áö SIGHUP ¸¦ ºí·°½ÃŰ°Ô µÈ´Ù. Çڵ鷯¿¡¼­ execl À» È£ÃâÇϹǷΠÀÌ Çڵ鷯´Â Àý´ë Á¾·áµÉ¼ö°¡ ¾ø°Ô µÈ´Ù. ´ç¿¬È÷ SIGHUP ½Ã±×³ÎÀº °è¼Ó ºí·° µÈä·Î ³²°Ô µÇ°í, »õ·Î µé¾î¿À´Â SIGHUP ´Â ¸ðµÎ ¹«½ÃµÇ°Ô µÈ´Ù.

ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â Äڵ尡 ½ÃÀ۵ɶ§ ÇØ´ç ½Ã±×³ÎÀÌ ºí·°µÇ¾î ÀÖ´ÂÁö È®ÀÎÇØ¼­ ºí·°À» ÇØÁ¦½ÃÄÑ ÁÖ¸é µÉ°ÍÀÌ´Ù. ¶ÇÇÑ ½Ã±×³ÎÀ» ±×·ìÁö¿ö¼­ °ü¸®ÇÏ¸é ¿©·¯°³ÀÇ ½Ã±×³ÎÀ» µ¿½Ã¿¡ °ü¸®ÇÒ¼ö ÀÖÀ½À¸·Î Æí¸®ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ½Ã±×³Î Á¦¾î¿Í ±×·ìÇÎÀ» À§Çؼ­ Unix ´Â ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù.
// ½Ã±×³Î ±×·ì°ü¸®¸¦ À§ÇÑ ÇÔ¼ö
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset-t *set, int signum);

// ½Ã±×³Î(±×·ì) Á¦¾î¸¦ À§ÇÑ ÇÔ¼ö
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *mask);


sigemptyset Àº set ÀÌ °¡¸£Å°´Â ½Ã±×³Î ÁýÇÕÀ» ÃʱâÈ­ ÇÑ´Ù.
sigfillset Àº set ÀÌ ¸ðµç ½ÅÈ£¸¦ Æ÷ÇÔÇϵµ·Ï ÃʱâÈ­ ÇÑ´Ù.
sigaddset Àº set¿¡ ½Ã±×³Î signum À» Ãß°¡ÇÑ´Ù.
sigdelset Àº set¿¡¼­ ½Ã±×³Î signum À» »èÁ¦ÇÑ´Ù.
sigismember Àº set¿¡ ½Ã±×³Î signum ÀÌ Æ÷ÇԵǾî ÀÖ´ÂÁö °Ë»çÇÑ´Ù.

sigprocmask Àº ½Ã±×³Î ¸¶½ºÅ©¸¦ °Ë»çÇÏ°í º¯°æÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. °£´ÜÈ÷ ¸»Çؼ­ ÇØ´ç ½Ã±×³Î¿¡ ´ëÇØ¼­ BLOCK, UNBLOCK ¸¦ Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.
sigpending Àº Àü´ÞµÈ ½Ã±×³Î(´ë±âÇϰí Àִ½ñ׳Î)¿¡ ´ëÇÑ °Ë»ç¸¦ Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù.
sigsuspend ÇØ´ç ½ÅÈ£°¡ ¹ß»ýÇÒ¶§±îÁö ÇÁ·Î¼¼½º¸¦ ÁߴܽÃŲ´Ù.

ÀÌ»ó ½Ã±×³Î ±×·ì°ü¸®¿Í ÀÌÀÇ Á¦¾î¸¦ À§ÇÑ ÇÔ¼ö¸¦ ¾Ë¾ÆºÃ´Âµ¥, ÀÌ »çÀÌÆ®ÀÇ ¸ñÀûÀÎ "¿¹Á¦¸¦ ÅëÇÑ ÀÌÇØ" ¸¦ À§Çؼ­ °£´ÜÇÑ ¿¹Á¦¸¦ ÁغñÇß´Ù. ÀÌ ¿¹Á¦´Â signal´Ù·ç±â(1) ÀÇ sig_hup ¿¡¼­ ¹ß°ßµÇ¾ú´ø "½Ã±×³Îºí·°" ¹®Á¦¸¦ À§ÀÇ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ ÇØ°áÇϵµ·Ï ÇÒ°ÍÀÌ´Ù.
¿¹Á¦: sig_hup2.c
#include <signal.h> 
#include <unistd.h> 

void sig_handler(int signo);

int main()
{
    int i = 0;
    sigset_t newmask, oldmask;

    printf("Program start\n");

    if (signal(SIGHUP, (void *)sig_handler) == SIG_ERR)
    {
        perror("signal set error ");
        exit(0)    ;
    }

    sigemptyset(&newmask);
    sigaddset(&newmask, SIGHUP);
    if (sigprocmask(SIG_UNBLOCK, &newmask, &oldmask) < 0)
    {
        perror("sigmask error : ");
        exit(0);
    }

    while(1)
    {
        printf("%d\n", i);
        i++;
        sleep(1);
    }
    return 1;
}

void sig_handler(int signo)
{
    execl("./sig_hup2", 0);
}

ÄÚµå´Â °£´ÜÇÏ´Ù. ¸ÕÀú sigemptyset¸¦ ÀÌ¿ëÇØ¼­ newmaskset À» ºñ¿ì°í, sigaddset ¸¦ ÀÌ¿ëÇØ¼­ ¿©±â¿¡ SIGHUP¸¦ Ãß°¡ ½ÃÄ×´Ù. ±×¸®°í sigprocmask ¸¦ ÀÌ¿ëÇØ¼­ newmaskset ¿¡ Æ÷ÇÔµÈ ½Ã±×³Îµé¿¡ ´ëÇØ¼­ ºí·°À» ÇØÁ¦Çϵµ·Ï Çß´Ù. ±×·¯¹Ç·Î Çڵ鷯°¡ Á¾·áµÇÁö ¾Ê¾Æ¼­ ½Ã±×³ÎÀÌ ºí·°µÈ »óŶóµµ, ºí·°ÇØÁ¦°¡ µÇ°í ÄÚµå´Â ¹®Á¦¾øÀÌ ÀÛµ¿ÇÏ°Ô µÉ°ÍÀÌ´Ù.

½ÅÈ£ ¹Þ±â ÇÔ¼ö

Áö±Ý±îÁö ¿ì¸®´Â ½ÅÈ£¸¦ ¹Þ±â À§Çؼ­ signal À̶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇß¾ú´Ù.
#include 
void (*signal(int signum, void (*handler)(int)))(int);
signal ÀÇ ¿øÇüÀº À§¿Í °°´Ù. »ç¿ë¹æ¹ýÀº ¸î°³ÀÇ ¿¹Á¦¿¡¼­ ÀÌ¹Ì º¸¾Æ¿ÔÀ½À¸·Î µû·Î ¼³¸íÇÏÁö ¾Ê°Ú´Ù.

±×·¯³ª ÇöÀç´Â À§ÀÇ signal Àº¾²Áö ¾Ê°í ´ë½Å sigaction ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. signal Àº ANSI C ¿¡ ÀÇÇØ¼­ Á¤ÀÇµÈ ÇÔ¼öÀε¥, ½ÅÈ£¿¡ ´ëÇÑ Á¤Àǰ¡ ¾Ö¸ÅÇÑ ºÒ¾ÈÁ¤ÇÑ ÇÔ¼öÀÌ´Ù. ±×·¯¹Ç·Î ¿¹Àü½î¾²¿ÍÀÇ È£È¯À» À§ÇÑ ¸ñÀûÀÌ ¾Æ´Ï¸é »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.

sigaction Àº POSIX.1 ¿¡ ÀÇÇØ¼­ Á¦¾ÈµÈ ¾ÈÁ¤µÈ ½ÅȣüÁ¦¸¦ Á¦°øÇÑ´Ù.
#include 
int sigaction(int signum,  const  struct  sigaction  *act, struct sigaction *oldact);
signum Àº ¸í½ÃµÉ ½Ã±×³Î ¹øÈ£ÀÌ´Ù. struct sigaction Àº ´ÙÀ½°ú °°ÀÌ Á¤ÀÇ µÈ´Ù.
struct sigaction
{
    void (*sa_handler)(int);     // signum °ú °ü·ÃµÈ Çڵ鷯 ÇÔ¼ö
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;           // ½Ã±×³Î 󸮵¿¾È ºí·°µÇ¾î¾ßÇÒ ½Ã±×³ÎÀÇ ¸¶½ºÅ©
    int sa_flags;               // ½Ã±×³ÎÀÇ Ã³¸® ÇàÀ§ Á¶ÀýÀ» À§ÇÑ Ç÷¡±×
    void (*sa_restorer)(void);  // »ç¿ëµÇÁö ¾Ê´Â´Ù. 
}
À§ÀÇ ±¸Á¶Ã¼¿¡¼­Ã³·³ ´ÜÁö ½Ã±×³Î¹øÈ£¿Í Çڵ鷯¸¸À» ³Ñ°ÜÁÖ´Â signal °ú ´Þ¸® ±¸Á¶Ã¼ ¸â¹ö¸¦ ÅëÇØ¼­ ´Ù¾çÇÑ Á¤º¸¸¦ ³Ñ°ÜÁÖ°Ô µÇ¸ç, ÀÌ·¯ÇÑ Æ¯¼ºÀ» ÀÌ¿ëÇØ¼­ ½Ã±×³Î¸¶½ºÅ·, °ü¸®, Çڵ鷯¸¦ À¯±âÀûÀ¸·Î ¹­¾îÁÙ¼ö ÀÖ°Ô µÈ´Ù.

¸¶Áö¸·À¸·Î "¿¹Á¦: sigint.c" ¸¦ sigaction ¹öÁ¯À¸·Î ÀÛ¼ºÇϰí sigint.c ÀÇ ¹®Á¦Á¡ÀÌ¿´´ø, ½Ã±×³Î Çڵ鷯 ½ÇÇàÁß ´Ù¸¥ ½Ã±×³ÎÀÌ µé¾î¿ÔÀ»°æ¿ì Áß´ÜµÇ¾î ¹ö¸®´Â ¹®Á¦¸¦ ÇØ°áÇϵµ·Ï Äڵ带 Àç ÀÛ¼ºÇÏ¿´´Ù.
¿¹Á¦: sigint2.c
#include <signal.h> 
#include <unistd.h> 
#include <string.h> 
#include <stdio.h> 

void sig_int(int signo);
void sig_usr(int signo);

int main()
{
    int i = 0;
    struct sigaction intsig, usrsig;

    usrsig.sa_handler = sig_usr;
    sigemptyset(&usrsig.sa_mask);
    usrsig.sa_flags = 0;

    intsig.sa_handler = sig_int;
    sigemptyset(&intsig.sa_mask);
    intsig.sa_flags = 0;

    if (sigaction(SIGINT, &intsig, 0) == -1)
    {
        printf ("signal(SIGALRM) error");
        return -1;
    }    

    if (sigaction(SIGUSR2, &usrsig, 0) == -1)
    {
        printf ("signal(SIGUSR2) error");
        return -1;
    }    

    while(1)
    {
        printf("%d\n", i);
        i++;
        sleep(1);
    }
}

void sig_int(int signo)
{
    sigset_t sigset, oldset;
    sigfillset(&sigset);
    // »õ·Îµé¾î¿À´Â ¸ðµç ½Ã±×³Î¿¡ ´ëÇØ¼­ block ÇÑ´Ù. 
    if (sigprocmask(SIG_BLOCK, &sigset, &oldset) < 0)
    {
        printf("sigprocmask %d error \n", signo);
    }
    fprintf(stderr, "SIGINT !!!!\n");
    sleep(5);
}

void sig_usr(int signo)
{
    printf("sig_usr2\n");
}
sig_int Çڵ鷯¸¦ È£ÃâÇÏ°Ô µÇ¸é sigfillset ¸¦ ÀÌ¿ëÇØ¼­ ¸ðµç ½Ã±×³ÎÀ» sigset ¿¡ ÀÔ·ÂÇϰí, ¿©±â¿¡ ´ëÇØ¼­ ºí·°À» ÇÏ°Ô µÈ´Ù. ±×·¯¹Ç·Î »õ·Î µµÂøÇÑ ½Ã±×³ÎÀº ÇöÀç Çڵ鷯°¡ ³¡³ª¼­ ºí·°À» ÇØÁ¦Çϱâ Àü±îÁö ´ë±âÇÏ°Ô µÈ´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.