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

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



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

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<article lang="ko"> 
 
<!--           --> 
<!-- ¹®¼­ Á¤º¸ --> 
<!--           --> 
<articleinfo> 
    <title>¾²·¹µå¿Í ½Ã±×³Î</title> 
 
    <author> 
        <surname>À± »ó¹è</surname> 
 
        <affiliation> 
            <address> 
                <email>dreamyun@yahoo.co.kr</email> 
            </address> 
        </affiliation> 
    </author> 
    <revhistory> 
        <revision> 
            <revnumber>0.9</revnumber> 
            <date>2004³â 1¿ù 29ÀÏ 23½Ã</date> 
            <revremark>½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ¾²·¹µå ÀÛµ¿/ÁßÁö Á¦¾î</revremark> 
        </revision> 
        <revision> 
            <revnumber>0.8</revnumber> 
            <date>2003³â 10¿ù 7ÀÏ 23½Ã</date> 
            <revremark>ÃÖÃÊ ¹®¼­ÀÛ¼º</revremark> 
        </revision> 
    </revhistory> 
</articleinfo> 
 
 
<!--                                                                 --> 
<!-- ¼½¼Ç ½ÃÀÛ                                                       --> 
<!--                                                                 --> 
<section> 
    <title>¾²·¹µå¿¡¼­ÀÇ ½Ã±×³Î »ç¿ë</title>     
    <para> 
        ¾²·¹µå¿¡¼­ÀÇ ½Ã±×³Î »ç¿ëÀº ½Ã±×³Î¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¸ °¡Áö°í ÀÖ´Ù¸é  
        ¾à°£ÀÇ ÀÀ¿ëÀ¸·Î ÃæºÐÈ÷ ÇØ°áÇÒ ¼ö ÀÖ´Â ¹®Á¦À̱ä ÇÏÁö¸¸  
        ¹ü À¯´Ð½ºÀûÀ¸·Î ÀÀ¿ëÇϰíÀÚ ÇÑ´Ù¸é(ƯÈ÷ ¸®´ª½º°¡ Æ÷ÇԵȴٸé) ¿î¿µÃ¼Á¦°£  
        ½Å°æ½áÁà¾ßÇÒ ¹®Á¦°¡ ÀÖ´Ù. À̹øÀå¿¡¼­´Â ¾²·¹µå¿¡¼­ÀÇ ½Ã±×³ÎÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú  
        ¿î¿µÃ¼Á¦°¡ ´Ù¸§À¸·Î ÀÎÇØ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦µé¿¡ ´ëÇØ¼­  
        ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.       
    </para> 
    <section> 
        <title>½Ã±×³ÎÀ» ƯÁ¤ ¾²·¹µå·Î º¸³»±â</title> 
        <para> 
            ¾²·¹µå¿¡¼­ ½Ã±×³ÎÀº ¼­·Î °øÀ¯µÈ´Ù´Â°É ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ¹®Á¦´Â °øÀ¯µÈ´Ù´Â Á¡Àε¥ 
            ¸¸¾à ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³¾ °æ¿ì ÇØ´ç ÇÁ·Î¼¼½º¿¡¼­ »ý¼ºµÈ ¸ðµç ¾²·¹µå¿¡ ½Ã±×³ÎÀÌ  
            Àü´ÞÀÌ µÇ°Ô µÈ´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â°Ô ¾Æ´Ï´Ù.    
        </para> 
        <para> 
            ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº ƯÁ¤ ¾²·¹µå¿¡¼­¸¸ ½Ã±×³ÎÀ» ¹Þµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.   
            ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ­ ¿ì¸®´Â ½Ã±×³Î ¸¶½ºÅ©¸¦ »ç¿ëÇÑ´Ù. ½Ã±×³Î ¸¶½ºÅ©´Â  
            ¸»±×´ë·Î ƯÁ¤ ½Ã±×³Î¿¡ ´ëÇØ¼­ ¸¶½ºÅ©¸¦ ¾º¿ì´Â °ÍÀ¸·Î ÇØ´ç ¾²·¹µå¿¡¼­  
            ƯÁ¤ ½Ã±×³Î¿¡ ´ëÇØ¼­ ¸¶½ºÅ©¸¦ ¾º¿ì¸é ¸¶½ºÅ·µÈ ½Ã±×³ÎÀº ÇØ´ç ¾²·¹µå·Î  
            Àü´ÞµÇÁö ¾Ê´Â´Ù.   
            ÀÌ ½Ã±×³ÎÀ» ¹Þ±â¸¦ ¿øÇÏ´Â ¾²·¹µå¿¡¼­´Â ÀÌ ½Ã±×³Î¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°Å½ÃŲ´Ù.  
            ±×·¯¸é ºí·°µÇ¾î ÀÖ´Â ½Ã±×³ÎÀº ¸¶½ºÅ©°¡ Á¦°ÅµÈ ¾²·¹µå·Î Àü´ÞµÉ °ÍÀÌ´Ù.  
            ÀÏÁ¾ÀÇ ÇÊÅͱâ´Ù. 
            <figure> 
                <title>½Ã±×³Î ¸¶½ºÅ©ÀÇ ÀÛµ¿¿ø¸®</title> 
                <graphic fileref="http://www.joinc.co.kr/albums/album01/aeo.gif"> 
            </figure> 
            À§ÀÇ ±×¸²Àº ½Ã±×³Î ¸¶½ºÅ©ÀÇ ÀÛµ¿¿ø¸®¸¦ º¸¿©ÁØ´Ù.  
            ¸ÞÀÎ ¾²·¹µå¿¡¼­´Â SIGINT¿Í SIGUSR2¿¡ ´ëÇØ¼­ ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Ä¡ÇÑ´Ù.  
            ±×¸®°í ¾²·¹µå 1¿¡¼­´Â SIGINT¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°ÅÇϰí, ¾²·¹µå 2¿¡¼­´Â  
            SIGUSR2¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°ÅÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é SIGINT°¡ ¸ÞÀÎ ¾²·¹µå¿¡  
            µµÂøÇßÀ» ¶§    ¸¶½ºÅ© ¶§¹®¿¡ ¸ÞÀÎ ¾²·¹µå¿¡´Â µµÂøÇÏÁö ¸øÇÏ°í ¾²·¹µå 1·Î  
            Àü´ÞµÉ °ÍÀÌ´Ù. SIGUSR2°¡ µµÂøÇßÀ» °æ¿ì ¸ÞÀÎ ¾²·¹µå¿Í ¾²·¹µå 1¿¡¼­´Â  
            ¸¶½ºÅ© ¶§¹®¿¡ Àü´ÞµÇÁö ¸øÇÏ°í ¾²·¹µå 2·Î ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù.  
            <xref linkend="sample1">¿¡¼­´Â À§ÀÇ ÀÛµ¿¿ø¸® ´ë·Î ±¸ÇöµÈ ¿¹Á¦ Äڵ带 ´Ù·ç°í ÀÖ´Ù.   
        </para> 
        <para> 
            ÀÌ·¯ÇÑ ¾²·¹µåº° ½Ã±×³Î ¸¶½ºÅ·À» À§Çؼ­ pthread´Â pthread_sigmask(3)¶ó´Â  
            ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.   
            <screen> 
#include <pthread.h> 
#include <signal.h> 
 
int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask); 
            </screen> 
            ÀÌ ÇÔ¼ö´Â ÇöÀç ¾²·¹µå¿¡ ½Ã±×³Î<emphasis>newmask</emphasis>¿Í <emphasis>how</emphasis> 
            ¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³Î ¸¶½ºÅ©¸¦ ¸¸µç´Ù. how´Â SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASKÁß  
            Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. SIG_BLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡  
            <emphasis>newmask</emphasis>¸¦ Ãß°¡Çϸç SIG_UNBLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡¼­  
            <emphasis>newmask</emphasis>¸¦ Á¦°ÅÇϰí SIG_SETMASK´Â <emphasis>newmask</emphasis>·Î  
            ÇöÀç ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Á¤ÇÑ´Ù. 
        </para> 
        <section id="sample1"> 
            <title>°£´Ü ¿¹Á¦</title> 
            <para> 
                ±×·³ pthread_mask(3)¸¦ ÀÌ¿ëÇÑ °£´ÙÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.  
                ÄÚµå´Â ¿©·¯ºÐÀÌ ½Ã±×³Î°ú ¾²·¹µå¿¡ °üÇÑ ÃÖ¼ÒÇÑÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ´Ù´Â  
                °¡Á¤ÇÏ¿¡ ÀÛ¼ºµÉ °ÍÀ̸ç, ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.  
            </para> 
            <para> 
                <emphasis>¿¹Á¦ : th_signal.c</emphasis> 
                <screen> 
#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); 
    } 
} 
                </screen> 
                À§ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲµÚ kill¸í·ÉÀ¸·Î SIGINT¿Í SIGUSR2 ½Ã±×³ÎÀ» PID·Î º¸³»º¸¸é  
                ÇØ´ç ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞµÇ°í ½Ã±×³Î Çڵ鷯°¡ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ»  
                °ÍÀÌ´Ù.  
            </para> 
        </section> 
    </section> 
    <section> 
        <title>¾²·¹µå°£ ½Ã±×³Î Àü¼Û</title> 
        <para> 
            ¿ÜºÎÀÇ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼­ ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ´Â °Í ¿Ü¿¡µµ °°Àº ÇÁ·Î¼¼½º¿¡¼­ ÀÛµ¿ÇÏ´Â  
            ¾²·¹µå°£¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇØ¾ß ÇÏ´Â °æ¿ìµµ »ý±æ °ÍÀÌ´Ù.  
        </para> 
        <para> 
            ÀÌ·¯ÇÑ ¾²·¹µå°£ ½Ã±×³Î Àü¼ÛÀº ¿©·¯°¡Áö ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÏÁ¤½Ã°£¸¶´Ù  
            ƯÁ¤ ¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÏ¹Ç·Î½á ¾²·¹µå¸¦ ±ú¿ö¼­ Äڵ带 ½ÇÇà½ÃŰ°Ô ÇѴٰųª  
            ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ write, read¿¡ ŸÀӾƿôÀ» °Ë»çÇÏ´Â ¿ëµµ·Îµµ »ç¿ë°¡´É ÇÏ´Ù.   
        </para> 
        <para> 
            ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ½º·¹µå°£ ½Ã±×³Î Àü´ÞÀ» ÅëÇØ ŸÀӾƿôÀ» °Ë»çÇÑ´Ù´Â  
            »ý°¢Àº Á» »ý¼ÒÇÒ ¼öµµ ÀÖÀ»°Í °°´Ù. º¸ÅëÀº select³ª alarmÀ» »ç¿ëÇÒ °Çµ¥,      
            ¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥ÀÇ °æ¿ì alarm(2)ÀÇ »ç¿ëÀº »ç½Ç»ó ¾î·Æ´Ù°í º¼ ¼ö ÀÖ´Ù.  
            ¿©·¯°³ÀÇ ¾²·¹µå¿¡¼­ alarm(2)À» »ç¿ëÇÒ °æ¿ì ´ÜÁö ÇϳªÀÇ alarm(¸¶Áö¸· alarm°ª)¸¸ÀÌ  
            µî·ÏµÇ¾î¼­ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×·¸´Ù¸é select¸¦ »ç¿ëÇØ¾ß ÇÒ °Çµ¥,  
            select´ë½Å¿¡ Àü¿ëÀÇ ½Ã±×³ÎÀ» ¹ß»ýÇÏ´Â ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.       
        </para> 
        <para> 
            read(2)¸¦ ¿¹·Î µé¾î¼­ ¼³¸íÇØ º¸ÀÚ read(2)¸¦ ÇϱâÀü¿¡ ƯÁ¤ (Àü¿ª)°ªÀ» 0À¸·Î ¼¼ÆÃÇ졒  
            read¸¦ ¼öÇàÇÑÈÄ 1·Î °ªÀ» º¯°æÇϵµ·Ï ÇÑ´Ù. ±×¸®°í ŸÀӾƿô üũ¸¦ À§ÇÑ ¾²·¹µå¿¡¼­´Â  
            ŸÀӾƿô ½Ã°£ °£°ÝÀ¸·Î(sleep(2)¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù) ÀÌ °ªÀ» °Ë»çÇÑ´Ù.  
            ¸¸¾à °ªÀÌ 0À¸·Î ¼¼ÆÃµÇ¾î ÀÖ´Â°É È®ÀÎ Çߴµ¥, ´ÙÀ½ ½Ã°£ÀÌ µ¹¾Æ¿Â µÚ¿¡µµ ÀÌ °ªÀÌ 0À̶ó¸é  
            read¿µ¿ª¿¡¼­ ŸÀӾƿôÀÌ ¹ß»ýÇß´Ù°í ÆÇ´Ü ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¸é ŸÀӾƿôÀÌ  
            ¹ß»ýÇÑ ¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇϵµ·Ï ÇÑ´Ù. ¾²·¹µå¿¡ ½Ã±×³ÎÀÌ Àü¼ÛÇϸé ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇ졒  
             read¿¡¼­ ºüÁ®³ª¿À°Ô µÈ´Ù.    
            <screen> 
if (read(..) < 0) 
{ 
   // ¸¸¾à ÀÎÅÍ·´Æ®·Î ÀÎÇÏ¿© ºüÁ®³ª¿Â °Å¶ó¸é.. 
   if (errno == EINTR) 
   { 
      ... 
   } 
}  
            </screen> 
            ½Ã±×³Î ¹ß»ý½Ã ÀÎÅÍ·´Æ®°¡ Àü´ÞµÇ°Ô ÇÏ·Á¸é ¾à°£ÀÇ ºÎ°¡ÀûÀÎ ÀÛ¾÷ÀÌ ÇÊ¿äÇѵ¥,  
            À̰ÍÀº <ulink url="http://www.joinc.co.kr/modules.php?name=News&file=article&sid=107">¼ÒÄÏ Å¸ÀӾƿô</ulink>À» Âü°íÇϱ⠹ٶõ´Ù.    
        </para> 
        <section> 
            <title>´Ù¸¥ ¾²·¹µå·Î ½Ã±×³Î Àü¼Û</title> 
            <para> 
                ÀÌ·¯ÇÑ ¾²·¹µå°£ ½Ã±×³Î Àü¼ÛÀ» À§Çؼ­ pthread_kill(3)À̶ó´Â ÇÔ¼ö°¡ Á¦°øµÈ´Ù.  
                <screen> 
#include <pthread.h> 
#include <signal.h> 
 
int pthread_kill(pthread_t thread, int signo); 
                </screen> 
                ù¹øÂ° ÀÎÀÚ<emphasis>thread</emphasis>´Â ½Ã±×³ÎÀ» Àü´Þ¹ÞÀ» ¾²·¹µåÀÇ ½Äº°ÀÚÀÌ°í  
                <emphasis>signo</emphasis>´Â Àü´ÞÇϰíÀÚ ÇÏ´Â ½Ã±×³Î ¹øÈ£ÀÌ´Ù.  
                º¸³»´Â ÂÊÀº pthread_kill(3)À» ÀÌ¿ëÇØ¼­ ºñ±³Àû °£´ÜÇÏ°Ô ±¸ÇöÀÌ °¡´ÉÇÏ´Ù.    
            </para> 
        </section> 
        <section> 
            <title>½Ã±×³Î ¹Þ±â</title> 
            <para> 
                ½Ã±×³ÎÀ» ¹Þ´Â ¾²·¹µåÀÇ °æ¿ì µ¿±â¿Í ºñµ¿±â µÎ°¡Áö ¹æ½ÄÀ» ÅëÇØ¼­ ¹ÞÀ» ¼ö ÀÖ´Ù.  
                µ¿±â ¹æ½ÄÀ¸·Î ¹ÞÀ» °æ¿ì´Â sigwait(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö  
                ºí·°µÇ¸é¼­ ±â´Ù¸°´Ù.   
                <screen> 
#include <pthread.h> 
#include <signal.h> 
 
int sigwait(const sigset_t *set, int *sig); 
                </screen> 
                ÀÌ ÇÔ¼ö´Â ½Ã±×³Î ¼Â<emphasis>set</emphasis>¿¡ ¼³Á¤µÈ ½Ã±×³ÎÁß Çϳª°¡ Àü´ÞµÉ ¶§±îÁö  
                È£ÃâµÈ ¿µ¿ª¿¡¼­ ´ë±âÇÑ´Ù. ½Ã±×³ÎÀ» ¹Þ¾Ò´Ù¸é ¸®Åϵǰí Àü´Þ ¹ÞÀº ½Ã±×³Î ¹øÈ£´Â  
                <emphasis>sig</emphasis>¸¦ ÅëÇØ¼­ ³Ñ¾î¿Â´Ù. ½Ã±×³ÎÀ» ±â´Ù¸°´Ù´Â Ư¡À» ÀÌ¿ëÇØ¼­  
                ¾²·¹µå°£ µ¿±âÈ­¸¦ À§ÇÑ ¸ñÀûÀ¸·Îµµ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.   
            </para> 
            <para> 
                µÎ¹øÂ°´Â ºñµ¿±âÀûÀÎ ¹æ½ÄÀ¸·Î ÄÚµå ½ÇÇàÁß¿¡ ½Ã±×³ÎÀÌ Àü´ÞµÇ¸é ÀÎÅÍ·´Æ®°¡ °É¸®°í  
                ½Ã±×³Î Çڵ鷯°¡ ¼öÇàµÇ´Â ¹æ½ÄÀÌ´Ù. 
                ÀϹÝÀûÀÎ ½Ã±×³Î »ç¿ë¹æ½Ä°ú µ¿ÀÏÇÏ´Ù.   
            </para> 
        </section> 
        <section> 
            <title>¿¹Á¦</title> 
            <para> 
                sigwait(3)¸¦ ÅëÇØ¼­ µ¿±âÀûÀ¸·Î ±â´Ù¸®´Â °ÍÀº ±¸ÇöÀÌ °£´ÜÇϹǷΠµû·Î ´Ù·çÁö ¾Ê°í  
                ½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇØ¼­ ºñµ¿±âÀûÀ¸·Î ½Ã±×³ÎÀ» ±â´Ù¸®´Â Äڵ带 ±¸ÇöÇØ º¸µµ·Ï ÇϰڴÙ.   
                <xref linkend="sample1">ÀÇ Äڵ带 ¾à°£ ¼öÁ¤Çß´Ù.  
            </para> 
            <para> 
                <emphasis>¿¹Á¦ : thtoth_sig.c</emphasis> 
                <screen> 
#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); 
        } 
    } 
} 
                </screen> 
                À§ÀÇ ÄÚµåÀÇ °æ¿ì ½Ã±×³ÎÀ» ¹ÞÀ» ¾²·¹µå¸¦ ¸í½ÃÇØÁÙ ¼ö ÀÖÀ¸¹Ç·Î  
                ½Ã±×³Î ¸¶½ºÅ©µîÀ» ¼³Ä¡ÇÒ Çʿ䰡 ¾ø´Ù. SIGINT°¡ ¿øÇÏ´Â ¾²·¹µå·Î  
                Á¤È®ÇÏ°Ô Àü´ÞµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.   
            </para> 
        </section> 
        <section> 
            <title>½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ¾²·¹µå ÀÛµ¿ Á¦¾î</title> 
            <para> 
                ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é ºñµ¿±â ÀûÀ¸·Î ƯÁ¤ ¾²·¹µå¸¦  
                Áß´Ü ½ÃÄÑ¾ß µÇ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ¹°·Ð ÀÓÀÇÀÇ ½ÃÁ¡¿¡¼­  
                Áß´ÜµÈ ¾²·¹µå¸¦ ´Ù½Ã ÀÛµ¿Çϵµ·Ï ¸¸µé¾î ÁÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. 
            </para> 
            <para> 
                ´Ù¸¥ ¿ìȸÀûÀÎ ¸î°¡Áö ±¸Çö ¹æ¹ýÀÌ ÀÖ°ÚÁö¸¸ ºñµ¿±âÀûÀΠ󸮸¦  
                À§Çؼ­´Â ¿ª½Ã ½Ã±×³Î¸¸ÇÑ°Ô ¾ø´Â °Í °°´Ù.   
                <screen> 
#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; 
} 
                </screen> 
            </para> 
        </section> 
    </section> 
    <section> 
        <title>¿î¿µÃ¼Á¦º° Â÷ÀÌÁ¡</title> 
        <para> 
            ¾²·¹µåÀÇ ÀÛµ¿¹æ½ÄÀº ¿î¿µÃ¼Á¦º°·Î ¸¹Àº Â÷À̸¦ º¸¿©ÁÙ ¼ö ÀÖÀ¸¸ç, Â÷ÀÌÁ¡¿¡  
            À¯ÀÇÇØ¼­ ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¿©±â¿¡¼­´Â ¼Ö¶ó¸®½º¿Í ¸®´ª½º¸¦  
            ºñ±³Çؼ­ ¼³¸íÇϵµ·Ï ÇϰڴÙ.  
        </para> 
        <para> 
            Áö±Ý±îÁöÀÇ ¾²·¹µå¿Í ½Ã±×³Î¿¡ ´ëÇØ¼­ ´Ù·ç¾ú´ø ³»¿ëÀº ¼Ö¶ó¸®½º¿Í °°ÀÌ  
            ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼­ ´ÙÁßÀÇ ¾²·¹µå¸¦ °ü¸®ÇÏ´Â °æ¿ì¸¦ ±âÁØÀ¸·Î Çß´Ù.  
            ±×·¯³ª ¸®´ª½ºÀÇ °æ¿ì clone(2)¸¦ ÅëÇÑ ´ÙÁß ÇÁ·Î¼¼½ºÇüÅ·Π¾²·¹µå°¡  
            »ý¼ºµÈ´Ù. ¶§¹®¿¡ ps¸¦ ÀÌ¿ëÇØ¼­ È®ÀÎÇÒ °æ¿ì ´ÙÁß ¾²·¹µå ÇÁ·Î¼¼½ºÀÓ¿¡µµ  
            ºÒ±¸ÇÏ°í °¢°¢ÀÇ PID¸¦ °¡Áö´Â ÇÁ·Î¼¼½º·Î ¾²·¹µå°¡ »ý¼ºµÇ´Â°É È®ÀÎ ÇÒ ¼ö  
            ÀÖ´Ù.  
        </para> 
        <para> 
            ÀÌ·± Ư¡ ¶§¹®¿¡ ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ ¿ÜºÎ ÇÁ·Î¼¼½º¿¡¼­ ½Ã±×³ÎÀ» ƯÁ¤ ¾²·¹µå·Î º¸³¾ °æ¿ì¿¡´Â  
            ¸ÞÀÎ ¾²·¹µå°¡ ¾Æ´Ñ ÇØ´ç ¾²·¹µåÀÇ PID¸¦ ¸í½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù.  
        </para> 
    </section> 
</section> 
</article> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.