pthread_kill(3)
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>pthread_kill(3)



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

<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<chapter lang=ko> 
<!-- ÀÛ¼ºÀÚ : yundream             --> 
<!-- ÀÛ¼ºÀÏ : 2004/01/03           --> 
<!-- ¿¬¶ôó : dreamyun@yahoo.co.kr --> 
 
<!-- ÇÔ¼ö À̸§À» ÀÔ·ÂÇÕ´Ï´Ù --> 
<title>pthread_kill(3)</title> 
 
<!-- ÀÌ°Ç ÇÔ¼ö¿¡ ´ëÇÑ ´ë·«ÀûÀÎ ¼³¸íÀ̱¸¿ä --> 
<para> 
    ¾²·¹µå ½Ã±×³Î °ü·Ã ÇÔ¼öµé 
</para> 
  
<!-- ¿©±â¿¡ ÇÔ¼öÀÇ °£´ÜÇÑ »ç¿ë¹ýÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>»ç¿ë¹ý</title> 
    <para> 
        <screen> 
#include <pthread.h> 
#include <signal.h> 
 
int pthread_kill(pthread_t thread, int signo); 
int  pthread_sigmask(int  how,  const  sigset_t  *newmask, 
               sigset_t *oldmask); 
int sigwait(const sigset_t *set, int *sig); 
        </screen> 
    </para> 
</section> 
 
<!-- ¿©±â¿£ ÇÔ¼öÀÇ ÀÚ¼¼ÇÑ ¼³¸í ÀÌ µé¾î°©´Ï´Ù --> 
<section> 
    <title>¼³¸í</title> 
    <para> 
        ÀÌ ÇÔ¼ö´Â ÇöÀç ¾²·¹µå¿¡ ½Ã±×³Înewmask¿Í how ¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³Î  
        ¸¶½ºÅ©¸¦ ¸¸µç´Ù. how´Â SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASKÁß  
        Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. SIG_BLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡  
        newmask¸¦ Ãß°¡Çϸç SIG_UNBLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î 
         ¸¶½ºÅ©¿¡¼­ newmask¸¦ Á¦°ÅÇϰí SIG_SETMASK´Â newmask·Î ÇöÀç  
        ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Á¤ÇÑ´Ù 
    </para> 
    <para> 
        pthread_kill()Àº ½Ã±×³Î¹øÈ£<emphasis>signo</emphasis>¸¦ °¡Áö´Â  
        ½Ã±×³ÎÀ» ½º·¹µå ½Äº°¹øÈ£<emphasis>thread</emphasis>¸¦ °¡Áö´Â  
        ¾²·¹µå¿¡ Àü´ÞÇÑ´Ù.   
    </para> 
    <para> 
        sigwait()´Â ½Ã±×³Î ¼Â<emphasis>set</emphasis>¿¡ ÁöÁ¤µÈ ½Ã±×³ÎÀÌ  
        Àü´ÞµÉ ¶§±îÁö ÇØ´ç¿µ¿ª¿¡¼­ ´ë±âÇÑ´Ù. ¸¸¾à ½Ã±×³ÎÀ» ¹Þ°Ô µÇ¸é  
        ¹ÞÀº ½Ã±×³Î ¹øÈ£¸¦ <emphasis>sig</emphasis>¿¡ º¹»çÇÏ°í ¸®ÅÏÇÑ´Ù.   
        <emphasis>set</emphasis>¿¡ ¸í½ÃµÈ ½Ã±×³ÎµéÀº ¹Ýµå½Ã ºÀ¼â·Î ÁöÁ¤µÇ¾î¾ß 
        ÇÑ´Ù. ±×·¡¾ß¸¸ sigwait()¿¡ ÀÇÇØ¼­ °ËÃâµÇ°í ¸®ÅϵȴÙ. ¸¸¾à  
        ÇØ´ç ½Ã±×³Î¿¡ ´ëÇØ¼­ ½Ã±×³Î Çڵ鷯°¡ ÁöÁ¤µÇ¾î ÀÖ´Ù¸é ÇÔ¼ö´Â  
        È£ÃâµÇÁö ¾Ê°Ô µÈ´Ù.  
    </para> 
</section> 
 
<!-- ÇÔ¼ö°¡ µÇµ¹·ÁÁÖ´Â °ªÀ̱¸¿ä --> 
<section> 
    <title>¹Ýȯ°ª</title> 
    <para> 
        ¼º°øÇϸé 0À», ½ÇÆÐÇϸé 0ÀÌ ¾Æ´Ñ °ªÀ» ¸®ÅÏÇÑ´Ù.    
    </para> 
</section> 
 
<!-- ¿¡·¯°¡ ¹ß»ýÇßÀ»¶§ µÇµ¹·ÁÁÖ´Â °ªµéÀÔ´Ï´Ù --> 
<section> 
    <title>¿¡·¯</title> 
    <para> 
        <variablelist>     
            <varlistentry> 
            <term>ESRCH</term>     
            <listitem> 
                <para>     
                    <emphasis>th</emphasis>½Äº°ÀÚ¸¦ °¡Áø ¾²·¹µå°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. 
                </para>     
            </listitem> 
            </varlistentry> 
            <varlistentry> 
            <term>EINVAL</term>     
            <listitem> 
                <para>     
                    <emphasis>th</emphasis>½Äº°ÀÚ¸¦ °¡Áø ¾²·¹µå°¡ ÀÌ¹Ì detach»óÅ¿¡ ÀÖ´Ù.  
                </para>     
            </listitem> 
            </varlistentry> 
        </variablelist>     
    </para> 
</section> 
 
<!-- ¸¶Áö¸·À¸·Î ¿¡Á¦ ÀÔ´Ï´Ù                                                 --> 
<!-- ¿©±â¿¡´Â ¿ÏÀüÇÑ ¿¹Á¦°¡ µé¾î°¡ Àִµ¥, ±»ÀÌ ¿ÏÀüÇÑ ¿¹Á¦¸¦ ¸¸µéÇÊ¿ä ¾øÀÌ --> 
<!-- ÄÚµå ÀϺκи¸ ÀÛ¼ºÇؼ­ ¿Ã·ÁÁּŵµ µË´Ï´Ù                               -->  
<!-- "<", ">", "&" µîÀº º¯È¯ÇØ ÁÖ¼Å¾ß Çϴµ¥, ±ÍÂúÀ¸½Ã¸é :-) º¯È¯ ÇÏÁö ¾Ê   --> 
<!-- ¾Æµµ µË´Ï´Ù. Á¦°¡ °Ë»ç ÇØ¼­ ¿Ã¸®°Ú½À´Ï´Ù                               --> 
<!-- ¿¹Á¦¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ» Àû¾îÁּŵµ µÇ±¸¿ä                            --> 
<section> 
    <title>¿¹Á¦</title> 
    <para> 
        <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()); 
 
    // SIGINT¿¡ ´ëÇØ¼­ ½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇßÁö¸¸  
    // SIGINT¸¦ ºí·°Çϵµ·Ï ÇßÀ¸¹Ç·Î ½Ã±×³ÎÀº Àü´ÞµÇÁö ¾Ê´Â´Ù.   
    sigemptyset(&newmask); 
    sigaddset(&newmask, SIGINT); 
    act.sa_handler = sig_handler; 
    sigaction(SIGINT, &act, NULL); 
    pthread_sigmask(SIG_BLOCK, &newmask, NULL);     
 
    while(1) 
    { 
        printf("%d\n", i); 
        i++; 
        sleep(1); 
    } 
    return ; 
} 
 
void *threadfunc2(void *arg) 
{ 
    struct sigaction act; 
    int lsigno; 
 
    sigset_t newmask; 
    sigemptyset(&newmask); 
    sigaddset(&newmask, SIGINT); 
 
    // ½Ã±×³Î Çڵ鷯¸¦ µî·Ï ½ÃÄ×Áö¸¸  
    // sigwiat()°¡ °¡µð¸®°í ÀÖÀ¸¹Ç·Î ½ÇÇàµÇÁö ¾Ê´Â´Ù.   
    act.sa_handler = sig_handler; 
    sigaction(SIGINT, &act, NULL); 
 
    while(1) 
    { 
        sigwait(&newmask, &lsigno); 
        printf("i receive signo %d\n", lsigno); 
        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> 
    </para> 
</section> 
<section> 
    <title>Âü°í¹®Çå</title> 
    <para> 
        <orderedlist> 
            <listitem> 
                <para> 
                    <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_¾²·¹µå¿Í_½Ã±×³Î">¾²·¹µå¿Í ½Ã±×³Î</ulink> 
                </para> 
            </listitem> 
            <listitem> 
                <para> 
                    <ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_Pthread_API_Reference">Pthread API ·¹ÆÛ·±½º</ulink> 
                </para> 
            </listitem> 
        </orderedlist> 
    </para> 
</section> 
</chapter> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.