¾²·¹µå¿Í ½Ã±×³Î
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



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

Docbook ¿ø¹®

¾²·¹µå¿Í ½Ã±×³Î

¾²·¹µå¿Í ½Ã±×³Î

À± »ó¹è

dreamyun@yahoo.co.kr

고친 과정
고침 0.92004³â 1¿ù 29ÀÏ 23½Ã
½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ¾²·¹µå ÀÛµ¿/ÁßÁö Á¦¾î
고침 0.82003³â 10¿ù 7ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º

1. ¾²·¹µå¿¡¼­ÀÇ ½Ã±×³Î »ç¿ë

¾²·¹µå¿¡¼­ÀÇ ½Ã±×³Î »ç¿ëÀº ½Ã±×³Î¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¸ °¡Áö°í ÀÖ´Ù¸é ¾à°£ÀÇ ÀÀ¿ëÀ¸·Î ÃæºÐÈ÷ ÇØ°áÇÒ ¼ö ÀÖ´Â ¹®Á¦À̱ä ÇÏÁö¸¸ ¹ü À¯´Ð½ºÀûÀ¸·Î ÀÀ¿ëÇϰíÀÚ ÇÑ´Ù¸é(ƯÈ÷ ¸®´ª½º°¡ Æ÷ÇԵȴٸé) ¿î¿µÃ¼Á¦°£ ½Å°æ½áÁà¾ßÇÒ ¹®Á¦°¡ ÀÖ´Ù. À̹øÀå¿¡¼­´Â ¾²·¹µå¿¡¼­ÀÇ ½Ã±×³ÎÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú ¿î¿µÃ¼Á¦°¡ ´Ù¸§À¸·Î ÀÎÇØ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦µé¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.


1.1. ½Ã±×³ÎÀ» ƯÁ¤ ¾²·¹µå·Î º¸³»±â

¾²·¹µå¿¡¼­ ½Ã±×³ÎÀº ¼­·Î °øÀ¯µÈ´Ù´Â°É ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ¹®Á¦´Â °øÀ¯µÈ´Ù´Â Á¡Àε¥ ¸¸¾à ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³¾ °æ¿ì ÇØ´ç ÇÁ·Î¼¼½º¿¡¼­ »ý¼ºµÈ ¸ðµç ¾²·¹µå¿¡ ½Ã±×³ÎÀÌ Àü´ÞÀÌ µÇ°Ô µÈ´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â°Ô ¾Æ´Ï´Ù.

¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº ƯÁ¤ ¾²·¹µå¿¡¼­¸¸ ½Ã±×³ÎÀ» ¹Þµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ­ ¿ì¸®´Â ½Ã±×³Î ¸¶½ºÅ©¸¦ »ç¿ëÇÑ´Ù. ½Ã±×³Î ¸¶½ºÅ©´Â ¸»±×´ë·Î ƯÁ¤ ½Ã±×³Î¿¡ ´ëÇØ¼­ ¸¶½ºÅ©¸¦ ¾º¿ì´Â °ÍÀ¸·Î ÇØ´ç ¾²·¹µå¿¡¼­ ƯÁ¤ ½Ã±×³Î¿¡ ´ëÇØ¼­ ¸¶½ºÅ©¸¦ ¾º¿ì¸é ¸¶½ºÅ·µÈ ½Ã±×³ÎÀº ÇØ´ç ¾²·¹µå·Î Àü´ÞµÇÁö ¾Ê´Â´Ù. ÀÌ ½Ã±×³ÎÀ» ¹Þ±â¸¦ ¿øÇÏ´Â ¾²·¹µå¿¡¼­´Â ÀÌ ½Ã±×³Î¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°Å½ÃŲ´Ù. ±×·¯¸é ºí·°µÇ¾î ÀÖ´Â ½Ã±×³ÎÀº ¸¶½ºÅ©°¡ Á¦°ÅµÈ ¾²·¹µå·Î Àü´ÞµÉ °ÍÀÌ´Ù. ÀÏÁ¾ÀÇ ÇÊÅͱâ´Ù.

그림 1. ½Ã±×³Î ¸¶½ºÅ©ÀÇ ÀÛµ¿¿ø¸®

À§ÀÇ ±×¸²Àº ½Ã±×³Î ¸¶½ºÅ©ÀÇ ÀÛµ¿¿ø¸®¸¦ º¸¿©ÁØ´Ù. ¸ÞÀÎ ¾²·¹µå¿¡¼­´Â SIGINT¿Í SIGUSR2¿¡ ´ëÇØ¼­ ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Ä¡ÇÑ´Ù. ±×¸®°í ¾²·¹µå 1¿¡¼­´Â SIGINT¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°ÅÇϰí, ¾²·¹µå 2¿¡¼­´Â SIGUSR2¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°ÅÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é SIGINT°¡ ¸ÞÀÎ ¾²·¹µå¿¡ µµÂøÇßÀ» ¶§ ¸¶½ºÅ© ¶§¹®¿¡ ¸ÞÀÎ ¾²·¹µå¿¡´Â µµÂøÇÏÁö ¸øÇÏ°í ¾²·¹µå 1·Î Àü´ÞµÉ °ÍÀÌ´Ù. SIGUSR2°¡ µµÂøÇßÀ» °æ¿ì ¸ÞÀÎ ¾²·¹µå¿Í ¾²·¹µå 1¿¡¼­´Â ¸¶½ºÅ© ¶§¹®¿¡ Àü´ÞµÇÁö ¸øÇÏ°í ¾²·¹µå 2·Î ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù. 1.1.1절¿¡¼­´Â À§ÀÇ ÀÛµ¿¿ø¸® ´ë·Î ±¸ÇöµÈ ¿¹Á¦ Äڵ带 ´Ù·ç°í ÀÖ´Ù.

ÀÌ·¯ÇÑ ¾²·¹µåº° ½Ã±×³Î ¸¶½ºÅ·À» À§Çؼ­ pthread´Â pthread_sigmask(3)¶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

#include <pthread.h>
#include <signal.h>

int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);
			
ÀÌ ÇÔ¼ö´Â ÇöÀç ¾²·¹µå¿¡ ½Ã±×³Înewmask¿Í how ¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³Î ¸¶½ºÅ©¸¦ ¸¸µç´Ù. how´Â SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASKÁß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. SIG_BLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡ newmask¸¦ Ãß°¡Çϸç SIG_UNBLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡¼­ newmask¸¦ Á¦°ÅÇϰí SIG_SETMASK´Â newmask·Î ÇöÀç ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Á¤ÇÑ´Ù.


1.1.1. °£´Ü ¿¹Á¦

±×·³ pthread_mask(3)¸¦ ÀÌ¿ëÇÑ °£´ÙÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÄÚµå´Â ¿©·¯ºÐÀÌ ½Ã±×³Î°ú ¾²·¹µå¿¡ °üÇÑ ÃÖ¼ÒÇÑÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ÀÛ¼ºµÉ °ÍÀ̸ç, ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.

¿¹Á¦ : th_signal.c

#include <pthread.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

/*
 * ½Ã±×³Î Çڵ鷯
 * Çڵ鷯°¡ È£ÃâµÈ ¾²·¹µåÀÇ ID¿Í ½Ã±×³Î ¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.   
 */
void sig_handler(int signo)
{
    printf("SIGNAL thid %d : %d\n", pthread_self(),signo);
}

void *threadfunc2(void *arg);
void *threadfunc(void *arg);

int main()
{
    int n, i, j;
    pthread_t threadid;

    // SIGINT¿Í SIGUSR2 ½Ã±×³ÎÀ» 
    // ½Ã±×³Î ¸¶½ºÅ©¿¡ µî·ÏÇÑ´Ù. 
    // ½Ã±×³Î ¸¶½ºÅ©´Â ¸ðµç ¾²·¹µå¿¡¼­ °øÀ¯µÈ´Ù. 
    // °í·Î ´Ù¸¥ ¾²·¹µå¿¡¼­µµ 
    // SIGINT, SIGUSR2½Ã±×³Î¿¡ ´ëÇØ¼­ ¸¶½ºÅ© µÈ´Ù. 
    sigset_t newmask;
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGINT);
    sigaddset(&newmask, SIGUSR2);
    pthread_sigmask(SIG_BLOCK, &newmask, NULL);

    // ¿øÇÏ´Â ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞÇÏ´ÂÁö È®ÀÎÇϱâ À§Çؼ­ 
    // ¾²·¹µå ID¸¦ È®ÀÎÇÑ´Ù. 
    if ((n = pthread_create(&threadid, NULL, threadfunc2, NULL)) != 0 )
    {
        perror("Thread create error ");
        exit(0);
    }
    printf("thread2 id %d\n", threadid);

    if ((n = pthread_create(&threadid, NULL, threadfunc, NULL)) != 0 )
    {
        perror("Thread create error ");
        exit(0);
    }
    printf("thread id %d\n", threadid);

    pthread_join(threadid, NULL);
}

void *threadfunc(void *arg)
{
    int i=0, j;
    struct sigaction act;
    sigset_t newmask;

    // °á°úÀÇ È®ÀÎÀ» À§Çؼ­ ¾²·¹µå ID¸¦ Ãâ·ÂÇÑ´Ù.  
    printf("SIGINT Thread Start %d\n", pthread_self());

    // SIGINT¿¡ ´ëÇÑ ½Ã±×³Î Çڵ鷯¸¦ ¼³Ä¡Ç졒  
    // ½Ã±×³Î ¸¶½ºÅ©¿¡¼­ SIGINT¸¦ Á¦°ÅÇÑ´Ù.  
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGINT);
    act.sa_handler = sig_handler;
    sigaction(SIGINT, &act, NULL);
    pthread_sigmask(SIG_UNBLOCK, &newmask, NULL);

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

void *threadfunc2(void *arg)
{
    struct sigaction act;

    // SIGUSR2¿¡ ´ëÇÑ ½Ã±×³Î Çڵ鷯¸¦ ¼³Ä¡Çϰí 
    // ½Ã±×³Î ¸¶½ºÅ©¿¡¼­ SIGUSR2¸¦ Á¦°ÅÇÑ´Ù.   
    sigset_t newmask;
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGUSR2);
    act.sa_handler = sig_handler;
    sigaction(SIGUSR2, &act, NULL);
    pthread_sigmask(SIG_UNBLOCK, &newmask, NULL);

    while(1)
    {
        sleep(1);
    }
}
				
À§ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲµÚ kill¸í·ÉÀ¸·Î SIGINT¿Í SIGUSR2 ½Ã±×³ÎÀ» PID·Î º¸³»º¸¸é ÇØ´ç ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞµÇ°í ½Ã±×³Î Çڵ鷯°¡ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


1.2. ¾²·¹µå°£ ½Ã±×³Î Àü¼Û

¿ÜºÎÀÇ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ´Â °Í ¿Ü¿¡µµ °°Àº ÇÁ·Î¼¼½º¿¡¼­ ÀÛµ¿ÇÏ´Â ¾²·¹µå°£¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇØ¾ß ÇÏ´Â °æ¿ìµµ »ý±æ °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ¾²·¹µå°£ ½Ã±×³Î Àü¼ÛÀº ¿©·¯°¡Áö ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÏÁ¤½Ã°£¸¶´Ù ƯÁ¤ ¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÏ¹Ç·Î½á ¾²·¹µå¸¦ ±ú¿ö¼­ Äڵ带 ½ÇÇà½ÃŰ°Ô ÇѴٰųª ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ write, read¿¡ ŸÀӾƿôÀ» °Ë»çÇÏ´Â ¿ëµµ·Îµµ »ç¿ë°¡´É ÇÏ´Ù.

³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ½º·¹µå°£ ½Ã±×³Î Àü´ÞÀ» ÅëÇØ ŸÀӾƿôÀ» °Ë»çÇÑ´Ù´Â »ý°¢Àº Á» »ý¼ÒÇÒ ¼öµµ ÀÖÀ»°Í °°´Ù. º¸ÅëÀº select³ª alarmÀ» »ç¿ëÇÒ °Çµ¥, ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥ÀÇ °æ¿ì alarm(2)ÀÇ »ç¿ëÀº »ç½Ç»ó ¾î·Æ´Ù°í º¼ ¼ö ÀÖ´Ù. ¿©·¯°³ÀÇ ¾²·¹µå¿¡¼­ alarm(2)À» »ç¿ëÇÒ °æ¿ì ´ÜÁö ÇϳªÀÇ alarm(¸¶Áö¸· alarm°ª)¸¸ÀÌ µî·ÏµÇ¾î¼­ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×·¸´Ù¸é select¸¦ »ç¿ëÇØ¾ß ÇÒ °Çµ¥, select´ë½Å¿¡ Àü¿ëÀÇ ½Ã±×³ÎÀ» ¹ß»ýÇÏ´Â ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

read(2)¸¦ ¿¹·Î µé¾î¼­ ¼³¸íÇØ º¸ÀÚ read(2)¸¦ ÇϱâÀü¿¡ ƯÁ¤ (Àü¿ª)°ªÀ» 0À¸·Î ¼¼ÆÃÇϰí read¸¦ ¼öÇàÇÑÈÄ 1·Î °ªÀ» º¯°æÇϵµ·Ï ÇÑ´Ù. ±×¸®°í ŸÀӾƿô üũ¸¦ À§ÇÑ ¾²·¹µå¿¡¼­´Â ŸÀӾƿô ½Ã°£ °£°ÝÀ¸·Î(sleep(2)¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù) ÀÌ °ªÀ» °Ë»çÇÑ´Ù. ¸¸¾à °ªÀÌ 0À¸·Î ¼¼ÆÃµÇ¾î ÀÖ´Â°É È®ÀÎ Çߴµ¥, ´ÙÀ½ ½Ã°£ÀÌ µ¹¾Æ¿Â µÚ¿¡µµ ÀÌ °ªÀÌ 0À̶ó¸é read¿µ¿ª¿¡¼­ ŸÀӾƿôÀÌ ¹ß»ýÇß´Ù°í ÆÇ´Ü ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¸é ŸÀӾƿôÀÌ ¹ß»ýÇÑ ¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇϵµ·Ï ÇÑ´Ù. ¾²·¹µå¿¡ ½Ã±×³ÎÀÌ Àü¼ÛÇϸé ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇϰí read¿¡¼­ ºüÁ®³ª¿À°Ô µÈ´Ù.

if (read(..) < 0)
{
   // ¸¸¾à ÀÎÅÍ·´Æ®·Î ÀÎÇÏ¿© ºüÁ®³ª¿Â °Å¶ó¸é..
   if (errno == EINTR)
   {
      ...
   }
} 
			
½Ã±×³Î ¹ß»ý½Ã ÀÎÅÍ·´Æ®°¡ Àü´ÞµÇ°Ô ÇÏ·Á¸é ¾à°£ÀÇ ºÎ°¡ÀûÀÎ ÀÛ¾÷ÀÌ ÇÊ¿äÇѵ¥, À̰ÍÀº ¼ÒÄÏ Å¸ÀӾƿôÀ» Âü°íÇϱ⠹ٶõ´Ù.


1.2.1. ´Ù¸¥ ¾²·¹µå·Î ½Ã±×³Î Àü¼Û

ÀÌ·¯ÇÑ ¾²·¹µå°£ ½Ã±×³Î Àü¼ÛÀ» À§Çؼ­ pthread_kill(3)À̶ó´Â ÇÔ¼ö°¡ Á¦°øµÈ´Ù.

#include <pthread.h>
#include <signal.h>

int pthread_kill(pthread_t thread, int signo);
				
ù¹øÂ° ÀÎÀÚthread´Â ½Ã±×³ÎÀ» Àü´Þ¹ÞÀ» ¾²·¹µåÀÇ ½Äº°ÀÚÀ̰í signo´Â Àü´ÞÇϰíÀÚ ÇÏ´Â ½Ã±×³Î ¹øÈ£ÀÌ´Ù. º¸³»´Â ÂÊÀº pthread_kill(3)À» ÀÌ¿ëÇØ¼­ ºñ±³Àû °£´ÜÇÏ°Ô ±¸ÇöÀÌ °¡´ÉÇÏ´Ù.


1.2.2. ½Ã±×³Î ¹Þ±â

½Ã±×³ÎÀ» ¹Þ´Â ¾²·¹µåÀÇ °æ¿ì µ¿±â¿Í ºñµ¿±â µÎ°¡Áö ¹æ½ÄÀ» ÅëÇØ¼­ ¹ÞÀ» ¼ö ÀÖ´Ù. µ¿±â ¹æ½ÄÀ¸·Î ¹ÞÀ» °æ¿ì´Â sigwait(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö ºí·°µÇ¸é¼­ ±â´Ù¸°´Ù.

#include <pthread.h>
#include <signal.h>

int sigwait(const sigset_t *set, int *sig);
				
ÀÌ ÇÔ¼ö´Â ½Ã±×³Î ¼Âset¿¡ ¼³Á¤µÈ ½Ã±×³ÎÁß Çϳª°¡ Àü´ÞµÉ ¶§±îÁö È£ÃâµÈ ¿µ¿ª¿¡¼­ ´ë±âÇÑ´Ù. ½Ã±×³ÎÀ» ¹Þ¾Ò´Ù¸é ¸®Åϵǰí Àü´Þ ¹ÞÀº ½Ã±×³Î ¹øÈ£´Â sig¸¦ ÅëÇØ¼­ ³Ñ¾î¿Â´Ù. ½Ã±×³ÎÀ» ±â´Ù¸°´Ù´Â Ư¡À» ÀÌ¿ëÇØ¼­ ¾²·¹µå°£ µ¿±âÈ­¸¦ À§ÇÑ ¸ñÀûÀ¸·Îµµ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

µÎ¹øÂ°´Â ºñµ¿±âÀûÀÎ ¹æ½ÄÀ¸·Î ÄÚµå ½ÇÇàÁß¿¡ ½Ã±×³ÎÀÌ Àü´ÞµÇ¸é ÀÎÅÍ·´Æ®°¡ °É¸®°í ½Ã±×³Î Çڵ鷯°¡ ¼öÇàµÇ´Â ¹æ½ÄÀÌ´Ù. ÀϹÝÀûÀÎ ½Ã±×³Î »ç¿ë¹æ½Ä°ú µ¿ÀÏÇÏ´Ù.


1.2.3. ¿¹Á¦

sigwait(3)¸¦ ÅëÇØ¼­ µ¿±âÀûÀ¸·Î ±â´Ù¸®´Â °ÍÀº ±¸ÇöÀÌ °£´ÜÇϹǷΠµû·Î ´Ù·çÁö ¾Ê°í ½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇØ¼­ ºñµ¿±âÀûÀ¸·Î ½Ã±×³ÎÀ» ±â´Ù¸®´Â Äڵ带 ±¸ÇöÇØ º¸µµ·Ï ÇϰڴÙ. 1.1.1절ÀÇ Äڵ带 ¾à°£ ¼öÁ¤Çß´Ù.

¿¹Á¦ : thtoth_sig.c

#include <pthread.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

/*
 * ½Ã±×³Î Çڵ鷯
 * Çڵ鷯°¡ È£ÃâµÈ ¾²·¹µåÀÇ ID¿Í ½Ã±×³Î ¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.
 */
void sig_handler(int signo)
{
    printf("SIGNAL RECV TH ID %d : %d\n", pthread_self(),signo);
}

void *threadfunc2(void *arg);
void *threadfunc(void *arg);
void *s_signal(void *arg);

// ¾²·¹µå ID¸¦ ÀúÀåÇÑ´Ù.  
int sigid[2];

int main()
{
    int n, i, j;
    pthread_t threadid;

    // ¿øÇÏ´Â ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞÇÏ´ÂÁö È®ÀÎÇϱâ À§Çؼ­
    // ¾²·¹µå ID¸¦ È®ÀÎÇÑ´Ù.
    if ((n = pthread_create(&threadid, NULL, threadfunc2, NULL)) != 0 )
    {
        perror("Thread create error ");
        exit(0);
    }
    sigid[0] = threadid;
    printf("thread2 id %d\n", threadid);

    if ((n = pthread_create(&threadid, NULL, threadfunc, NULL)) != 0 )
    {
        perror("Thread create error ");
        exit(0);
    }
    sigid[1] = threadid;
    printf("thread id %d\n", threadid);

    if ((n = pthread_create(&threadid, NULL, s_signal, NULL)) != 0 )
    {
        perror("Thread create error ");
        exit(0);
    }

    pthread_join(threadid, NULL);
}

void *threadfunc(void *arg)
{
    int i=0, j;
    struct sigaction act;
    sigset_t newmask;

    // °á°úÀÇ È®ÀÎÀ» À§Çؼ­ ¾²·¹µå ID¸¦ Ãâ·ÂÇÑ´Ù.
    printf("SIGINT Thread Start %d\n", pthread_self());

    sigemptyset(&newmask);
    sigaddset(&newmask, SIGINT);
    act.sa_handler = sig_handler;
    sigaction(SIGINT, &act, NULL);

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

void *threadfunc2(void *arg)
{
    struct sigaction act;

    sigset_t newmask;
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGINT);
    act.sa_handler = sig_handler;
    sigaction(SIGINT, &ct, NULL);

    while(1)
    {
        sleep(1);
    }
}

/*
 * SIGINT¸¦ µÎ°³ÀÇ ¾²·¹µå·Î ¼­·Î´Ù¸¥ ½Ã°£°£°ÝÀ¸·Î 
 * Àü´ÞÇÑ´Ù. 
 */
void *s_signal(void *arg)
{
    int i = 1;
    while(1)
    {
        sleep(1);
        i++;
        if((i % 7) == 0)
        {
            printf("Send SIGINT %d\n", sigid[0]);
            pthread_kill(sigid[0], SIGINT);
        }
        if((i % 11) == 0)
        {
            printf("Send SIGINT %d\n", sigid[1]);
            pthread_kill(sigid[1], SIGINT);
        }
    }
}
				
À§ÀÇ ÄÚµåÀÇ °æ¿ì ½Ã±×³ÎÀ» ¹ÞÀ» ¾²·¹µå¸¦ ¸í½ÃÇØÁÙ ¼ö ÀÖÀ¸¹Ç·Î ½Ã±×³Î ¸¶½ºÅ©µîÀ» ¼³Ä¡ÇÒ Çʿ䰡 ¾ø´Ù. SIGINT°¡ ¿øÇÏ´Â ¾²·¹µå·Î Á¤È®ÇÏ°Ô Àü´ÞµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


1.2.4. ½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ¾²·¹µå ÀÛµ¿ Á¦¾î

¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é ºñµ¿±â ÀûÀ¸·Î ƯÁ¤ ¾²·¹µå¸¦ Áß´Ü ½ÃÄÑ¾ß µÇ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ¹°·Ð ÀÓÀÇÀÇ ½ÃÁ¡¿¡¼­ Áß´ÜµÈ ¾²·¹µå¸¦ ´Ù½Ã ÀÛµ¿Çϵµ·Ï ¸¸µé¾î ÁÖ¾î¾ß ÇÒ°ÍÀÌ´Ù.

´Ù¸¥ ¿ìȸÀûÀÎ ¸î°¡Áö ±¸Çö ¹æ¹ýÀÌ ÀÖ°ÚÁö¸¸ ºñµ¿±âÀûÀΠ󸮸¦ À§Çؼ­´Â ¿ª½Ã ½Ã±×³Î¸¸ÇÑ°Ô ¾ø´Â °Í °°´Ù.

#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>

pthread_t thread_t[3];

void sig_handler(int signo)
{
    printf("Thread Stop %d:\n", (int)pthread_self());
    sleep(100);
}

void null(int signo)
{
    printf("Thread Start\n");
}

void *test(void *data)
{
    sigset_t newmask;
    struct sigaction act, act2;
    int i = 0;

    sigemptyset(&newmask);
    sigaddset(&newmask, SIGUSR1);
    sigaddset(&newmask, SIGCONT);
    act.sa_handler = sig_handler;
    act2.sa_handler = null;

    sigaction(SIGUSR1, &act, NULL);
    sigaction(SIGCONT, &act2, NULL);

    pthread_sigmask(SIG_UNBLOCK, &newmask, NULL);

    while(1)
    {
        printf("Im child Thread %d %d\n", (int)pthread_self(),i);
        i++;
        sleep(1);
    }
}

void *worker(void *data)
{

    sigset_t newmask;
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGUSR1);
    sigaddset(&newmask, SIGCONT);

    pthread_sigmask(SIG_BLOCK, &newmask, NULL);
    while(1)
    {
        sleep(2);
        pthread_kill(thread_t[0], SIGUSR1);
        sleep(3);
        pthread_kill(thread_t[0], SIGCONT);
    }
}

int main()
{
    pthread_create(&thread_t[0], NULL, test, NULL);
    pthread_create(&thread_t[1], NULL, test, NULL);
    pthread_create(&thread_t[2], NULL, worker, NULL);

    pthread_join(thread_t[0], NULL);
    pthread_join(thread_t[1], NULL);
    return 1;
}
				


1.3. ¿î¿µÃ¼Á¦º° Â÷ÀÌÁ¡

¾²·¹µåÀÇ ÀÛµ¿¹æ½ÄÀº ¿î¿µÃ¼Á¦º°·Î ¸¹Àº Â÷À̸¦ º¸¿©ÁÙ ¼ö ÀÖÀ¸¸ç, Â÷ÀÌÁ¡¿¡ À¯ÀÇÇØ¼­ ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¿©±â¿¡¼­´Â ¼Ö¶ó¸®½º¿Í ¸®´ª½º¸¦ ºñ±³Çؼ­ ¼³¸íÇϵµ·Ï ÇϰڴÙ.

Áö±Ý±îÁöÀÇ ¾²·¹µå¿Í ½Ã±×³Î¿¡ ´ëÇØ¼­ ´Ù·ç¾ú´ø ³»¿ëÀº ¼Ö¶ó¸®½º¿Í °°ÀÌ ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼­ ´ÙÁßÀÇ ¾²·¹µå¸¦ °ü¸®ÇÏ´Â °æ¿ì¸¦ ±âÁØÀ¸·Î Çß´Ù. ±×·¯³ª ¸®´ª½ºÀÇ °æ¿ì clone(2)¸¦ ÅëÇÑ ´ÙÁß ÇÁ·Î¼¼½ºÇüÅ·Π¾²·¹µå°¡ »ý¼ºµÈ´Ù. ¶§¹®¿¡ ps¸¦ ÀÌ¿ëÇØ¼­ È®ÀÎÇÒ °æ¿ì ´ÙÁß ¾²·¹µå ÇÁ·Î¼¼½ºÀÓ¿¡µµ ºÒ±¸ÇÏ°í °¢°¢ÀÇ PID¸¦ °¡Áö´Â ÇÁ·Î¼¼½º·Î ¾²·¹µå°¡ »ý¼ºµÇ´Â°É È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.

ÀÌ·± Ư¡ ¶§¹®¿¡ ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ ¿ÜºÎ ÇÁ·Î¼¼½º¿¡¼­ ½Ã±×³ÎÀ» ƯÁ¤ ¾²·¹µå·Î º¸³¾ °æ¿ì¿¡´Â ¸ÞÀÎ ¾²·¹µå°¡ ¾Æ´Ñ ÇØ´ç ¾²·¹µåÀÇ PID¸¦ ¸í½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù.


Cache Error
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.