Real Time Signal
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN"> 
<article lang="ko"> 
 
<!--           --> 
<!-- ¹®¼­ Á¤º¸ --> 
<!--  http://squid.visolve.com/developments/squid_rt_whitepaper.htm --> 
<articleinfo> 
    <title>Real Time Signal</title> 
 
    <author> 
        <surname>À± »ó¹è</surname> 
 
        <affiliation> 
            <address> 
                <email>yundream@www.joinc.co.kr</email> 
            </address> 
        </affiliation> 
    </author> 
    <revhistory> 
        <revision> 
            <revnumber>1.1</revnumber> 
            <date>2003³â 8¿ù 25ÀÏ 23½Ã</date> 
            <revremark>ÇÁ·Î¼¼½º°£ RTSÀü´Þ Ãß°¡</revremark> 
        </revision> 
        <revision> 
            <revnumber>1.0</revnumber> 
            <date>2003³â 8¿ù 23ÀÏ 23½Ã</date> 
            <revremark>sigqueueÇÔ¼ö ¼³¸í Ãß°¡</revremark> 
        </revision> 
        <revision> 
            <revnumber>0.8</revnumber> 
            <date>2003³â 8¿ù 13ÀÏ 23½Ã</date> 
            <revremark>ÃÖÃÊ ¹®¼­ÀÛ¼º</revremark> 
        </revision> 
    </revhistory> 
</articleinfo> 
 
 
<!--                                                                 --> 
<!-- ¼½¼Ç ½ÃÀÛ                                                       --> 
<!--                                                                 --> 
<section> 
    <title>¼Ò°³</title> 
    <para> 
        ÀÌ »çÀÌÆ®ÀÇ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °ü·Ã ¹®¼­µéÀ» ¸î°³ ÀÐ¾î º¸¾Ò´Ù¸é  
        ºÐ¸í RealTime signal(ÀÌÇÏ RTS)¿¡ ´ëÇØ¼­ µé¾î º¸¾ÒÀ» °ÍÀÌ´Ù.  
        Áö±Ý±îÁöÀÇ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼­ »ç¿ëµÇ¾ú´ø ±â¼úµéÀº  
        polling±â¹ÝÀÌ¿´´Ù. Áï ¸Þ½ÃÁö°¡ µµÂøÇϱ⸦ °è¼Ó üũÇÏ´Â ¹æ½ÄÀ¸·Î  
        ÀÔÃâ·ÂÀ» ó¸®ÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌ·¯ÇÑ ÀÔÃâ·Â¹æ½Ä(ÁÖ·Î select(2)¿Í poll(2) 
        À» ÀÀ¿ëÇÑ)À¸·Îµµ ´ëºÎºÐÀÇ ³×Æ®¿öÅ© ÀÔÃâ·ÂÀ» ó¸®Çϱ⿡´Â ÃæºÐÇÏÁö¸¸  
        ÃÖ±Ù ÀÎÅͳݻ󿡼­ ó¸®ÇؾßÇÒ µ¥ÀÌÅÍÀÇ ¾çÀÌ ´Ã¾î³²¿¡ µû¶ó  
        ¸î¸î °æ¿ì¿¡ À־ °íÀüÀûÀÎ ¹æ¹ýÀ¸·Î ÇѰ踦 µå·¯³»°Ô µÇ¾ú´Ù. 
    </para> 
    <para> 
        ±×·¡¼­ Á¦¾ÈµÈ ¹æ¹ýÀÌ RTS¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î ±â¹ÝÀÇ ÀÔÃâ·Â ó¸® ±â¹ýÀÌ´Ù.  
        RTS´Â ½Ã±×³ÎÀÇ È®ÀåÆÇÀÌ´Ù. ±âÁ¸ÀÇ ½Ã±×³ÎÀÌ Å¥À×ÀÌ µÇÁö ¾ÊÀ¸¸ç,  
        Àü´Þ µÇ¾úÀ» ¶§ ¾Æ¹«·± Á¤º¸¸¦ ¾Ë·ÁÁÖÁö ¾Ê´Â ¹Ý¸é RTS´Â ½Ã±×³Î ó·³  
        (°ÅÀÇ) ½Ç½Ã°£¿¡ Àü´ÞµÇ¸ç ÀÔÃâ·Â µ¥¾îÅÍÀÇ ¿øÇÒÇÑ Ã³¸®¸¦ À§ÇÑ ÇÊ¿äÇÑ  
        Á¤º¸µé±îÁö ÇÔ²² Àü´ÞÇÑ´Ù. °Ô´Ù°¡ ½Ã±×³ÎÀÇ ´ë±â¿­(Å¥)¸¦ À¯ÁöÇØ¼­  
        ¿©·¯°³ÀÇ ½Ã±×³ÎÀÌ ÂªÀº ½Ã°£¿¡ µµÂøÇÏ´õ¶óµµ ½Ã±×³ÎÀ» ÀÒ¾î ¹ö¸®´Â  
        ¹®Á¦¸¦ ÇØ°á Çß´Ù.   
    </para> 
    <para> 
        ÀÌ ¹®¼­´Â RTS¿¡ ´ëÇÑ °³³ä¼Ò°³¿Í ÀÀ¿ëÀ» ´ã°í ÀÖ´Ù. Ư¼º»ó  
        poll(2)¿Í °°Àº ÇÔ¼ö¿Í ÀÚÁÖ ºñ±³µÉ °ÍÀÌ´Ù.   
    </para> 
</section> 
 
<section> 
    <title>poll(2)À» ÀÌ¿ëÇÑ À̺¥Æ® ÅëÁö</title> 
    <section> 
        <title>poll(2)ÀÇ ÀÎÅÍÆäÀ̽º</title> 
        <para> 
            ³×Æ®¿öÅ© »ó¿¡¼­ÀÇ ¸¹Àº Ŭ¶óÀÌ¾ðÆ®·Î ºÎÅÍÀÇ µ¥ÀÌÅÍÀÇ Ã³¸®¸¦  
            À§Çؼ­ »ç¿ëµÇ´Â ÀüÅëÀûÀÎ ¹æ¹ýÀº select(2)³ª poll(2)À» ÀÌ¿ëÇØ¼­  
            ¼ÒÄÏ(ÆÄÀÏ)·Î ºÎÅÍÀÇ À̺¥Æ®¸¦ °Ë»çÇÏ´Â ¹æ¹ýÀÌ´Ù.  
            ´ÙÀ½Àº poll(2)ÀÇ ÀϹÝÀûÀÎ ÀÎÅÍÆäÀ̽º ÀÌ´Ù.   
            <screen> 
/* Flags to indicate socket events. 0 indicates no event. */ 
 
#define POLLIN      0x0001    /* There is data to read */ 
#define POLLPRI     0x0002    /* There is urgent data to read */ 
#define POLLOUT     0x0004    /* Writing now will not block */ 
#define POLLERR     0x0008    /* Error condition */ 
#define POLLHUP     0x0010    /* Hung up */ 
#define POLLNVAL    0x0020    /* Invalid request: fd not open */ 
 
struct pollfd { 
  int fd; 
  short events; 
  short revents; 
}; 
 
int poll(struct pollfd *pfds, int number, int timeout); 
            </screen> 
            ´ë·«ÀûÀÎ ÀÛµ¿ ¹æ½ÄÀº pfds¿¡ µî·ÏµÈ ÆÄÀÏ(¼ÒÄÏ)¿¡ ¾î¶² À̺¥Æ®°¡  
            ÀÖ´ÂÁö °Ë»ç¸¦ ÇØ¼­, À̺¥Æ®°¡ ¹ß»ýµÇ¾ú´Ù¸é À̸¦ ¸®ÅÏÇÏ´Â ½ÄÀÌ´Ù. 
            ÀÚ¼¼ÇÑ ³»¿ëÀº <ulink url=http://www.joinc.co.kr/modules.php?name=News&file=article&sid=26http://www.joinc.co.kr/modules.php?name=News&file=article&sid=26>´ÙÁß¿¬°á¼­¹ö ¸¸µé±â (3)</ulink>¸¦  
            Âü°íÇϱ⠹ٶõ´Ù.   
        </para> 
        <section> 
            <title>poll(2)ÀÇ ¹®Á¦Á¡</title> 
            <para> 
                poll(2)ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¸î °¡ÁöÀÇ ´ÜÁ¡À» °¡Áö°Ô µÇ°í, ÀÌ·¯ÇÑ  
                ´ÜÁ¡µé ¶§¹®¿¡ µ¿½Ã¿¡ ¸¹Àº ¼öÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ´Ù·ç´Âµ¥  
                ºñÈ¿À²À̶ó´Â ¹®Á¦Á¡À» °¡Áö°Ô µÈ´Ù.  
                <itemizedlist> 
                    <listitem> 
                    <para> 
                        pool(2)½Ã½ºÅÛ ÄÝÀº À̺¥Æ®¸¦ ¹Þ±â À§Çؼ­ Ä¿³Î ½ºÆäÀ̽º¿¡¼­  
                        À¯Àú ½ºÆäÀ̽º·Î À̺¥Æ®¸¦ º¹»çÇÑ´Ù. ±×¸®°í ¾÷µ¥ÀÌÆ®µÈ À̺¥Æ® ¸®½ºÆ®¸¦ 
                        À¯Àú ½ºÆäÀ̽º¿¡¼­ Ä¿³Î ½ºÆäÀ̽º·Î ´Ù½Ã º¹»çÇÑ´Ù.  
                        Áï ÇϳªÀÇ À̺¥Æ®¸¦ Àü´Þ¹Þ±â À§Çؼ­ 2¹øÀÇ º¹»ç°¡ ¹ß»ýÇÑ´Ù.  
                        ÀϹÝÀûÀ¸·Î º¹»ç´Â »ó´çÈ÷ ¸¹Àº ÀÚ¿øÀ» ¼Ò¸ðÇÑ´Ù.   
                    </para> 
                    </listitem> 
                    <listitem> 
                    <para> 
                        Ä¿³Î°ú ¾îÇø®ÄÉÀÌ¼Ç ¾çÂÊ ¸ðµÎ À̺¥Æ®°¡ ¹ß»ýÇÑ ¼ÒÄÏÀ» °Ë»çÇ챉  
                        À§Çؼ­ ¿­¸° ¼ÒÄϸðµÎ¸¦ °Ë»çÇØ¾ß ÇÑ´Ù.   
                    </para> 
                    </listitem> 
                    <listitem> 
                    <para> 
                        º¸Åë ¿¬°áµÈ ¼ÒÄÏÁß¿¡¼­ ´Ü 10%¿¡¼­ 20%¸¸ÀÌ È°µ¿Çϰí ÀÖ´Â ¼ÒÄÏÀÌ´Ù.  
                        poll(2)Àº ÀÌ 10%¿¡¼­20%ÀÇ È°¼ºÈ­µÈ ¼ÒÄÏ, ±×Áß¿¡¼­µµ ´ÜÁö ¸î°³ÀÇ  
                        À̺¥Æ® ¹ß»ýÇÑ ¼ÒÄÏÀ» ã¾Æ³»±â À§Çؼ­ ¼ö½Ê ȤÀº ¼ö¹é°³ÀÇ ¼ÒÄÏÀ»  
                        µÚÁö´Â ÀÛ¾÷À» ¹Ýº¹ÇØ¾ß ÇÑ´Ù.   
                    </para> 
                    </listitem> 
                </itemizedlist> 
            </para> 
            <para> 
            </para> 
        </section> 
    </section> 
</section> 
 
<section> 
    <title>POSIX RTS</title> 
    <para> 
        ÀÌ·¯ÇÑ poll()°ú select()ÀÇ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ ¸î°¡Áö »õ·Î¿î ¹æ¹ýµéÀÌ  
        Á¦¾ÈµÇ¾ú´Ù. declare_interest()¿Í get_next_event()¿Í °°ÀÌ À̺¥Æ®°¡ ¹ß»ýÇÑ  
        ¼ÒÄÏÀ» µî·ÏÇÏ°í µÇµ¹·ÁÁÖ´Â ÇÔ¼ö, Ä¿³Î°ú À¯Àú»çÀÌÀÇ µ¥ÀÌÅÍ º¹»ç¸¦ ÁÙÀÌ´Â  
        ¹æ½ÄÀ¸·Î poll()À» Á»´õ Çâ»ó½ÃŲ /dev/pollµîÀÌ ¸¸µé¾îÁ® ÀÖ´Ù. ±×¸®°í  
        FreeBSD¿î¿µÃ¼Á¦ÀÇ kqueue¿Í °°Àº °ÍµéÀÌ ÀÖ´Ù. /dev/pollÀº poll()º¸´Ù  
        ¼º´ÉÀûÀ¸·Î Çâ»óµÇ¾î ÀÖÁö¸¸ ¿©ÀüÈ÷ Ä¿³Î ·¹º§¿¡¼­ ¸ðµç ¿­¸°  
        ¼ÒÄÏÀ» µÚÁ®¾ß ÇÑ´Ù´Â ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù. kqueue´Â poll()¿¡¼­ ¹ß»ýÇÒ ¼ö  
        ÀÖ´Â ¼º´É ÀúÇÏ ¹®Á¦¸¦ ÇØ°áÇϸ鼭µµ RTS°¡ °¡Áö´Â »ç¿ë»óÀÇ ¾î·Á¿ò±îÁö  
        ÇØ°áÇÑ(½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â)¸Å¿ì ¸Å·ÂÀûÀÎ µµ±¸ÀÌ´Ù. 
        ¾ÈŸ±õ°Ôµµ ÇöÀç ¸®´ª½º Á¤½ÄÄ¿³Î 2.4.x¿¡¼­´Â kqueue¸¦ Áö¿øÇÏÁö ¾Ê°í ÀÖ´Ù.  
        ±×·¯³ª ÀÌ¹Ì °ü·ÃµÈ ÆÐÄ¡°¡ ³ª¿À°í ÀÖÀ¸´Ï ¾Æ¸¶ 2.6.x¿¡¼­´Â Á¤½ÄÀ¸·Î  
        Áö¿øÇÒ °Í°°´Ù.  
    </para> 
    <para> 
        ÀÌ ¹®¼­¿¡¼­´Â ÇöÀç Á¤½ÄÀ¸·Î Áö¿øµÇ°í ÀÖ´Â RTS¸¸À» ¼³¸í ÇÒ °ÍÀÌ´Ù. ÀÌÇÏ  
        RTS¶õ POSIX RTS¸¦ ĪÇÑ´Ù. 
    </para> 
    <section> 
        <title>RTS¶õ</title> 
        <para> 
            RTS´Â ºñµ¿±â(asynchronous) À̺¥Æ®¸¦ Àü´ÞÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î ¸¸µé¾î  
            Á³À¸¸ç, ÁÖ·Î ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀÌ¼Ç ÀÛ¼º½Ã ¼ÒÄÏ À̺¥Æ®¸¦ Å뺸Çϱâ À§Çؼ­  
            »ç¿ëÇÑ´Ù. RTS´Â ³×Æ®¿öÅ© ÀÔÃâ·Â¿¡ À־ polling¿¡ ºñÇØ ¿ùµîÇÑ ¼º´É  
            Çâ»óÀ» º¸ÀåÇØ ÁØ´Ù. 
        </para> 
        <para> 
            ½Ã±×³ÎÀÇ ÀåÁ¡ÀÎ ½Ç½Ã°£¼ºÀ» À¯ÁöÇϸ鼭 ´ÜÁ¡ÀÎ ´ë±â¿­ºÎÀçÀÇ ¹®Á¦¸¦ ÇØ°áÇÑ  
            Çâ»óµÈ ½Ã±×³Îµµ±¸¶ó°í ÀÌÇØÇÒ ¼ö ÀÖ´Ù.   
        </para> 
    </section> 
    <section> 
        <title>RTS¿Í Ç¥ÁØ ½Ã±×³Î(signal)°úÀÇ ºñ±³</title>     
        <para> 
            RTS´Â ´ÙÀ½ÀÇ µÎ°¡Áö Á¡¿¡ À־ À¯´Ð½º Ç¥ÁØ ½Ã±×³Î°ú Å©°Ô ´Ù¸£´Ù.  
            <itemizedlist> 
                <listitem> 
                <para> 
                    À¯´Ð½º Ç¥ÁØ ½Ã±×³ÎÀº ½Ã±×³Î ¹ß»ý½Ã ´ÜÁö ½Ã±×³ÎÀÌ Àü´ÞµÇ¾ú´Ù´Â  
                    »ç½Ç°ú Àü´ÞµÈ ½Ã±×³ÎÀÇ ¹øÈ£¸¸À» ¾Ë ¼ö ÀÖ´Ù. ¹Ý¸é RTS´Â  
                    siginfo_t ±¸Á¶Ã¼¿¡ ½Ã±×³Î¿¡ °ü·ÃµÈ ¿©·¯°¡Áö Á¤º¸±îÁö ÇÔ²² Àü´Þ  
                    µÈ´Ù.      
                    <screen> 
typedef struct siginfo { 
   int si_signo;     /* Signal number */ 
   int si_errno;     /* Error code */ 
   int si_code; 
   pid_t si_pid; 
   uid_t si_uid; 
   void *si_addr;  
   union sigval si_value; 
   union { 
      /* Skipping other fields */ 
      struct { 
         int _band;  /* Socket event flags (similar to poll) */ 
         int _fd;    /* Socket fd where event occurred */ 
      } _sigpoll; 
   } _sifields; 
}  siginfo_t; 
 
#define si_fd     _sifields._sigpoll._fd  
                    </screen> 
                    À§ÀÇ ±¸Á¶Ã¼¸¦ º¸¸é ½Ã±×³Î ¹øÈ£´Â ¹°·ÐÀ̰í, ¾î¶² ¼ÒÄÏ¿¡¼­  
                    À̺¥Æ®¸¦ ¹ß»ý½ÃÄ×´ÂÁö¿¡ °üÇÑ ±âŸ ¿©·¯°¡Áö Á¤º¸µéÀ»  
                    °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. RTS¸¦ »ç¿ëÇÏ¸é ½Ã±×³Î°ú ÇÔ²²  
                    ÀÌ·¯ÇÑ ºÎ°¡ Á¤º¸µé±îÁö ÇÔ²² Àü´Þ ¹Þ´Â´Ù.  
                    ´ÙÀ½Àº siginfo_t¸â¹öµé¿¡ ´ëÇÑ »ó¼¼ ¼³¸íÀÌ´Ù.   
                    <variablelist> 
                    <varlistentry> 
                        <term>si_signo</term> 
                        <listitem> 
                            <para> 
                                ½Ã±×³Î ¹øÈ£ÀÌ´Ù. ÀÌ ½Ã±×³Î ¹øÈ£´Â ½Ã±×³ÎÇڵ鷯¿¡µµ 
                                µ¿ÀÏÇÏ°Ô Àü´ÞµÈ´Ù.   
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_errno</term> 
                        <listitem> 
                            <para> 
                                errno°ª 
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_code</term> 
                        <listitem> 
                            <para> 
                                ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ ¾î¶²ÀÌÀ¯·Î ½Ã±×³ÎÀÌ ¹ß»ýÇß´ÂÁö  
                                °ü·ÃµÈ °ªÀÌ´Ù. 
                                <table> 
                                <title>SI_CODE Á¾·ù</title> 
                                <tgroup cols=2> 
                                <tbody>     
                                <row> 
                                    <entry>°ª</entry>     
                                    <entry>¼³¸í</entry> 
                                </row> 
                                <row> 
                                    <entry>SI_ASYNCIO</entry> 
                                    <entry>¼ÒÄÏÀ¸·Î ºñµ¿±â ÀÔÃâ·Â À̺¥Æ® ¹ß»ý, °¡Àå °ü½ÉÀÖ¾î ÇÏ´Â ½Ã±×³ÎÀÌ´Ù.</entry> 
                                </row> 
                                <row> 
                                    <entry>SI_QUEUE</entry> 
                                    <entry>sigqueue()ÇÔ¼ö¸¦ ÅëÇÑ ½Ã±×³Î ¹ß»ý</entry> 
                                </row> 
                                <row> 
                                    <entry>SI_TIMER</entry> 
                                    <entry>½Ã°£ Ãʰú</entry> 
                                </row> 
                                <row> 
                                    <entry>SI_USER</entry> 
                                    <entry>kill()ÇÔ¼öµî¿¡ ÀÇÇÑ ½Ã±×³Î ¹ß»ý</entry> 
                                </row> 
                                </tbody>     
                                </tgroup> 
                                </table> 
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_pid</term> 
                        <listitem> 
                            <para> 
                                ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ ÇÁ·Î¼¼½ºÀÇ ¾ÆÀ̵ð(PID) 
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_uid</term> 
                        <listitem> 
                            <para> 
                                ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ ÇÁ·Î¼¼½ºÀÇ UID·Î si_code°¡ SI_USERÀÏ °æ¿ì¿¡¸¸  
                                °ªÀÌ ¼³Á¤µÈ´Ù.  
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_status</term> 
                        <listitem> 
                            <para> 
                                ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼­ SIGCHLD½Ã±×³ÎÀÌ ¹ß»ý½Ã۰í Á¾·áÇßÀ» °æ¿ì  
                                ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á¾·á°ª 
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_value</term> 
                        <listitem> 
                            <para> 
                                sigqueue()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³ÎÀ» ¹ß»ý½Ãų °æ¿ì »ç¿ëÀÚ°¡ º¸³½  
                                °ªÀÌ ÀúÀåµÇ¾î ÀÖ´Ù.   
                                <screen> 
typedef union sigval 
{ 
    int sival_int; 
    void *sival_ptr; 
} sigval_t; 
                                </screen> 
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_addr</term> 
                        <listitem> 
                            <para> 
                                ¸Þ¸ð¸® ÂüÁ¶ÁÖ¼ÒÀÇ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÑ´Ù. À̰ÍÀº SIGSEGV, SIGBUS, SIGILL, 
                                SIGFPE µîÀÌ ¹ß»ýÇßÀ» ¶§¸¸ Àû¿ëµÈ´Ù.  
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    <varlistentry> 
                        <term>si_fd</term> 
                        <listitem> 
                            <para> 
                                À̺¥Æ®¸¦ ¹ß»ý½ÃŲ ÆÄÀÏÁöÁ¤ÀÚ. 
                            </para> 
                        </listitem> 
                    </varlistentry> 
                    </variablelist> 
                </para> 
                </listitem> 
                <listitem> 
                <para> 
                    Ç¥ÁØ ½Ã±×³ÎÀº ½Ã±×³ÎÀÇ ´ë±â¿­À» À¯ÁöÇÒ ¼ö ¾ø´Ù. ¸¸¾à ½Ã±×³ÎÇڵ鷯°¡  
                    ¸®ÅϵDZâÀü¿¡ ¿©·¯°³ÀÇ µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù¸é ±× Áß ÇϳªÀÇ ½Ã±×³Î¸¸  
                    Àü´ÞµÉ »ÓÀÌ´Ù. ³ª¸ÓÁö ½Ã±×³ÎÀº ÀÒ¾î ¹ö¸°´Ù. ¹Ý¸é  
                    RTS´Â ½Ã±×³ÎÀÇ ´ë±â¿­À» À¯ÁöÇÒ ¼ö ÀÖÀ¸¹Ç·Î, µ¿½Ã¿¡ ¿©·¯°³ÀÇ ½Ã±×³ÎÀÌ  
                    Àü´ÞµÈ´Ù°í ÇÏ´õ¶óµµ À̵éÀ» ´ë±â¿­¿¡ ´ã¾ÆµÑ ¼ö ÀÖ´Ù.  
                </para> 
                </listitem> 
            </itemizedlist> 
        </para> 
    </section> 
    <section> 
        <title>RTS ´ë±â¿­ÀÇ Å©±â</title> 
        <para> 
            ¾ÆÁ÷ Å×½ºÆ® ÇØº¸Áø ¾Ê¾ÒÁö¸¸ ÀÌ·ÐÀûÀ¸·Î³ª¸¶ RTS´Â ´ë±â¿­À»  
            °¡Áú ¼ö ÀÖ´Ù°í ¹è¿ü´Ù. ±×·¸´Ù¸é RTS´ë±â¿­ÀÇ Å©±â°¡ ¾î´ÀÁ¤µµ ÀÎÁö  
            ±Ã±ÝÇÒ °ÍÀÌ´Ù. ¸¸¾à RTS´ë±â¿­ÀÇ Å©±â°¡ ÃæºÐÈ÷ Å©Áö ¾Ê´Ù¸é,  
            ¹Ù»Û¼­¹öÀÇ °æ¿ì ºü¸¥½Ã°£¿¡ ´ë±â¿­ÀÌ °¡µæ Â÷¹ö¸®´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ  
            Àֱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¿¡ ´ëÇØ¼­´Â ´ÙÀ½ ±â»ç¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.   
        </para> 
    </section> 
    <section> 
        <title>RTS¿Í poll°úÀÇ ºñ±³</title> 
        <para> 
            ¾ÕÀå¿¡¼­ poll¿¡ ´ëÇØ¼­ °£´ÜÈ÷ »ìÆìº¸¾Ò´Ù. poll°ú RTS¸ðµÎ À̺¥Æ®¸¦ ¹Þ¾Æ¼­  
            ó¸®ÇÑ´Ù´Â Á¡¿¡¼­´Â ¸Å¿ì ºñ½ÁÇÏÁö¸¸ ¼º´É¿¡¼­´Â ¸¹Àº Â÷À̰¡ ³­´Ù.  
            poll¿¡¼­´Â ºó¹øÇÑ µ¥ÀÌÅÍ º¹»ç°¡ ÀϾ¸ç À̺¥Æ®°¡ ¹ß»ýÇÑ ÆÄÀÏÀ» ã±â À§Çؼ­  
            ¿­¸° ÆÄÀÏÀ» ¸ðµÎ °Ë»çÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ¿­¸° ÆÄÀÏÀÌ ¿­¸î°³ Á¤µµ¶ó¸é º°¹®Á¦  
            ¾ø°ÚÁö¸¸ ¼ö¹é¿¡¼­ õ¿¡ À°¹ÚÇÏ°Ô µÇ¸é À̺¥Æ®°¡ ¹ß»ýÇÑ ÆÄÀÏÀ» ã´Âµ¥ µå´Â ºñ¿ëµµ  
            °áÄÚ ¹«½ÃÇÒ ¼ö ¾ø°Ô µÈ´Ù.   
        </para> 
        <para> 
            RTS´Â À̺¥Æ® ÅëÁö½Ã ¾î¶² ÆÄÀÏ¿¡ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö¿¡ ´ëÇÑ Á¤º¸±îÁö  
            µÇµ¹·Á ÁֹǷΠºÎ°¡ÀûÀÎ ÀÛ¾÷¾øÀÌ ÇØ´çÆÄÀÏÀ» ÅëÇÑ ÀÛ¾÷ÀÌ °¡´ÉÇÏ´Ù.    
            <figure> 
                <title>poll°ú RTS¿¡¼­ÀÇ ÆÄÀÏ À̺¥Æ® üũ</title> 
                <graphic fileref=http://www.joinc.co.kr/albums/album01/adh.gif> 
            </figure> 
        </para> 
    </section> 
    <section> 
        <title>RTSÁö¿ø È®ÀÎ</title> 
        <para> 
            ÃÖ½ÅÀÇ ´ëºÎºÐÀÇ À¯´Ð½º ¿î¿µÃ¼Á¦µéÀº RTS¸¦ Áö¿øÇÑ´Ù. RTS¸¦ Áö¿øÇÏ´ÂÁö  
            È®ÀÎÇÏ´Â °¡Àå È®½ÇÇÑ ¹æ¹ýÀº kill¸í·ÉÀ» ÀÌ¿ëÇØ¼­ Ä¿³Î¿¡¼­ Áö¿øÇÏ´Â  
            ½Ã±×³Î ¸ñ·ÏÀ» È®ÀÎÇÏ´Â ¹æ¹ýÀÌ´Ù.  
            <screen> 
[root@joinc /root]# kill -l 
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL 
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE 
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2 
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD 
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN 
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ 
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO 
30) SIGPWR      31) SIGSYS      32) SIGRTMIN    33) SIGRTMIN+1 
34) SIGRTMIN+2  35) SIGRTMIN+3  36) SIGRTMIN+4  37) SIGRTMIN+5 
38) SIGRTMIN+6  39) SIGRTMIN+7  40) SIGRTMIN+8  41) SIGRTMIN+9 
42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13 
46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14 
50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 
54) SIGRTMAX-9  55) SIGRTMAX-8  56) SIGRTMAX-7  57) SIGRTMAX-6 
58) SIGRTMAX-5  59) SIGRTMAX-4  60) SIGRTMAX-3  61) SIGRTMAX-2 
62) SIGRTMAX-1  63) SIGRTMAX 
            </screen> 
            1-31±îÁö´Â À¯´Ð½º Ç¥ÁØ ½Ã±×³ÎÀ» À§ÇØ ¿¹¾àµÈ ¿µ¿ªÀ̸ç, 
            32¹ø ºÎÅÍ 63¹ø ±îÁö°¡ RTS¸¦ À§ÇØ ¿¹¾àµÈ ¿µ¿ªÀÌ´Ù. RTS¸¦ À§ÇØ  
            ¿¹¾àµÈ ½Ã±×³ÎÀÇ °¹¼ö´Â ¿î¿µÃ¼Á¦¸¶´Ù ¾à°£¾¿ Ʋ¸®´Ù. RTS¸¦ »ç¿ëÇ챉  
            ¿øÇÑ´Ù¸é À̵é ÁغñµÈ ½Ã±×³ÎÁß Çϳª¸¦ »ç¿ëÇÏ¸é µÈ´Ù.    
        </para> 
    </section> 
    <section> 
        <title>RTS¸¦ ÀÌ¿ëÇÑ ³×Æ®¿öÅ© ÀÔÃâ·Â ó¸®</title> 
        <para> 
            ±×·³ RTS¸¦ ÀÌ¿ëÇØ¼­ ¼ÒÄÏ¿¡¼­ ¹ß»ýÇÑ À̺¥Æ®¸¦ ÅëÁö ¹Þ´Â ¹æ¹ý¿¡ ´ëÇØ¼­  
            ¾Ë¾Æ º¸µµ·Ï ÇÏÀÚ.  
        </para> 
        <para> 
            °¡Àå ¸ÕÀú ÇØ¾ß ÇÒÀÏÀº ¼ÒÄÏÆÄÀÏÀÌ RTS¿¡ ¹ÝÀÀÇϵµ·Ï ¼³Á¤ÇÏ´Â ÀÏÀÌ´Ù.  
            À̰ÍÀº ÆÄÀÏÆ¯¼ºÁ¶ÀÛ ÇÔ¼öÀÎ fcntl(2)À» ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. fcntl()ÇÔ¼ö¸¦  
            ÀÌ¿ë ÇØ´ç ¼ÒÄÏÀ» ³íºí·°,ºñµ¿±â ¸ðµå·Î ÀÛµ¿Çϵµ·Ï ¼¼ÆÃÇÑÈÄ,  
            ½Ã±×³Î ¹øÈ£°¡ SIGRTMINº¸´Ù Ŭ°æ¿ì ÇØ´ç ¼ÒÄÏÀ¸·Î Àü´ÞµÇµµ·Ï ¼¼ÆÃÇÑ´Ù.    
            <screen> 
int sockfd = accept(..); 
 
// ¼ÒÄÏÀ» ³íºí·°,ºñµ¿±â·Î ¼³Á¤ÇÑ´Ù. 
fcntl(sockfd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC); 
// SIGRTMINº¸´Ù ´õ Å« RTS½Ã±×³ÎÀÌ Àü´ÞµÇµµ·Ï ÇÑ´Ù.  
fcntl(sockfd, F_SETSIG, SIGRTMIN); 
// ½Ã±×³ÎÀ» º¸³¾ ÇÁ·Î¼¼½º ID¸¦ ¼³Á¤ÇÑ´Ù.  
// ¿©±â¿¡¼­´Â ÀÚ±â ÇÁ·Î¼¼½º·Î º¸³»µµ·Ï Çß´Ù.  
fcntl(sockfd, F_SETOWN, getpid()); 
fcntl(sockfd, F_SETAUXFL, O_ONESIGFD); 
            </screen> 
            ¼ÒÄÏ¿¡ RTS°¡ ÅëÁöµÇµµ·Ï Çß´Ù¸é ¼ÒÄÏ¿¡ RTS°¡ ÅëÁöµÇ¾úÀ» ¶§ ÇÊ¿äÇÑ  
            ÀÛ¾÷À» Çϵµ·Ï Äڵ带 Ãß°¡ÇÏ¸é µÈ´Ù. ÀÏ´ÜÀº RTS°¡ ÅëÁöµÇ¾ú´ÂÁö  
            È®ÀÎÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. À¯´Ð½º´Â sigwaitinfo()¿Í  
            sigtimedwait()ÇÔ¼ö¸¦ Á¦°øÇϸç, ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ RTSÅëÁö¸¦ È®ÀÎÇÒ ¼ö  
            ÀÖ´Ù.  
            <screen> 
#include <signal.h> 
 
int sigwaitinfo(const sigset_t *set, siginfo_t *info); 
int sigtimedwait(const sigset_t *set, siginfo_t *info, const 
      struct timespec *timeout); 
int sigqueue(pid_tpid, int sig, const union sigval value); 
            </screen> 
            <emphasis>set</emphasis>Àº ±â´Ù¸± ½Ã±×³ÎÁ¤º¸°¡ ¼³Á¤µÇ´Â ±¸Á¶Ã¼À̸ç,  
            ½Ã±×³ÎÀÌ ÅëÁö µÇ¸é ÇØ´ç Á¤º¸°¡ <emphasis>info</emphasis>¿¡ º¹»çµÈ´Ù.  
            sigtimewait()´Â ±â´Ù¸®´Â ½Ã°£À» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â  
            sigwaitinfo()¿Í ¿ÏÀüÈ÷ µ¿ÀÏ ÇÏ´Ù. ´ÙÀ½Àº À̵é ÇÔ¼ö¸¦ ÅëÇØ¼­  
            ½Ã±×³ÎÀ» ¹Þ°í ÇÊ¿äÇÑ ÀÏÀ» ó¸®ÇÏ´Â ÀüÇüÀûÀÎ ÄÚµåÀÇ ¸ð½ÀÀ» º¸¿©ÁØ´Ù.  
            <screen> 
sigset_t signalset; 
siginfo_t siginfo; 
int signum, sockfd, revents; 
 
sigemptyset(&signalset); 
sigaddset(&signalset, SIGRTMIN); 
 
signum = sigwaitinfo (&signalset, &siginfo);  
if (signum == SIGRTMIN) 
{ 
    sockfd = siginfo.si_fd; 
    revents = siginfo.si_band; 
    // sockfd¿Í revents¸¦ ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÑ´Ù.  
} 
            </screen> 
            ´Ù¸¥ ÇÁ·Î¼¼½º·Î (nonrealtime)½Ã±×³ÎÀ» º¸³»±â À§Çؼ­ kill(2)À» »ç¿ëÇÒ ¼ö  
            ÀÖ´Â °Íó·³ RTS¸¦ ´Ù¸¥ ÇÁ·Î¼¼½º·Î º¸³¾ ¼ö Àִµ¥, À̶§ »ç¿ëÇÏ´Â  
            ÇÔ¼ö°¡ <emphasis>sigqueue(2)</emphasis>ÀÌ´Ù. º¸³»´Â Ãø¿¡¼­´Â  
            3¹øÂ° ÀÎÀÚÀÎ <emphasis>sgval</emphasis>¸¦ ÅëÇØ¼­ ºÎ°¡ÀûÀÎ Á¤º¸±îÁö  
            ÇÔ²² Àü¼ÛÇÒ ¼ö ÀÖ´Ù. ÀÌ Á¡À» ÀÌ¿ëÇϸé IPC¿ëµµ·Îµµ »ç¿ë °¡´ÉÇÒ °ÍÀÌ´Ù.  
            <xref linkend="rtsipc">¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°í ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù. 
        </para> 
    </section> 
    <section> 
        <title>RTS ³×Æ®¿öÅ© ¿¹Á¦ ÀÛ¼º</title> 
        <para> 
            ±×·³ RTS¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. Áö±Ý±îÁö´Â RTSÀÇ ÀåÁ¡¿¡ ´ëÇØ¼­¸¸  
            ¾ê±â Çß¾ú´Âµ¥, RTS¿¡µµ ÇѰ¡Áö ´ÜÁ¡ÀÌ Àִµ¥, ±×°ÍÀº Á¦´ë·Î ´Ù·ç·Á¸é  
            ²Ï º¹ÀâÇÑ ÄÚµù °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î Á¦´ë·ÎµÈ  
            RTSÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ·Á¸é ²Ï³ª ¸¹Àº ½Å°æ½á¾ß ÇҰ͵éÀÌ Á¸ÀçÇÑ´Ù.     
        </para> 
        <para> 
            À̹ø¿¹Á¦´Â ÀÌ·¯ÇÑ º¹ÀâÇÑ °úÁ¤À» Á¦¿ÜÇϰí RTSÀÇ ±â´ÉÀ» ¸Àº¸°í Å×½ºÆ®ÇÒ  
            ¼ö ÀÖ´Â °£´ÜÇÑ ÀÀ¿ëÀ¸·Î ÇÒ °ÍÀÌ´Ù.   
        </para> 
        <para> 
            ¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº  
             <ulink url=http://www.joinc.co.kr/modules.php?name=News&file=article&sid=63>UDP ÇÁ·Î±×·¡¹ÖÀÇ ±âÃÊ</ulink>¿¡¼­ ´Ù·ç¾ú´ø µ¡¼À¿¬»ê ¼­¹ö ÇÁ·Î±×·¥À»  
            RTS¸¦ ÀÌ¿ëÇØ¼­ ÀÛµ¿Çϵµ·Ï ÀçÀÛ¼ºÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.  
            Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº ±×´ë·Î Àç»ç¿ë Çϵµ·Ï ÇϰڴÙ. ´Ù¸¸  
            ¿©±â¼­ Á¦ÀÛÇÏ´Â ¼­¹ö´Â RTSÀÇ Æ¯¼ºÀ» È®ÀÎÇϱâ À§Çؼ­ 2°³ÀÇ Æ÷Æ®¸¦  
            ¸¸µé°ÍÀÌ´Ù. ±×·¯¹Ç·Î Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥¿ª½Ã ¼­·Î ´Ù¸¥ Æ÷Æ®·Î  
            Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ¾à°£ÀÇ ¼öÁ¤À» ÇØÁÖ¾î¾ß ÇÑ´Ù. Æ÷Æ®¹øÈ£¸¦ ÀÎÀÚ·Î  
            ¹Þ¾Æ¼­ ó¸®Çϵµ·Ï ¼öÁ¤ÇØ ÁÖ±â¹Ù¶õ´Ù.    
        </para> 
        <para> 
            ÄÚµå´Â ´Ü¼øÇÏÁö¸¸ Á¦´ë·Î ÀÌÇØÇ챉  
            À§Çؼ­´Â ½Ã±×³Î°ú ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ±âº»ÀûÀ¸·Î ÀÌÇØÇ졒  
            ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·± ±âº»ÀûÀÎ ³»¿ëÀº ÀÌÇØÇϰí ÀÖ´Ù°í °¡Á¤Ç졒  
            ´ëºÎºÐÀÇ ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.   
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : sum_server_rts.c</emphasis> 
            <screen> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/stat.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <sys/types.h> 
 
// F_SETSIGÀÇ ÀÌ¿ëÀ» À§Çؼ­ __USE_GNU¸¦ µðÆÄÀÎ ÇÑ´Ù.  
#ifndef __USE_GNU 
#define __USE_GNU 
#endif 
 
#include <fcntl.h> 
 
/* 
 * Ŭ¶óÀÌ¾ðÆ®¿Í Åë½Å¿¡ »ç¿ëÇÒ µ¥ÀÌÅÍ 
 */   
struct data 
{ 
    int a; 
    int b; 
    int sum; 
}; 
 
/* 
 * ÀÎÀÚ·Î ÁÖ¾îÁø ÆÄÀÏ ÁöÁ¤ÀÚ¿¡ ´ëÇã¼­    
 * ºñºÀ¼â(NONBLOCK), ºñµ¿±â(ASYNC)·Î ÁöÁ¤Çϰí 
 * ¸®¾óŸÀÓ ½Ã±×³Î(SIGRTMIN)¿¡ ´ëÀÀÇϵµ·Ï ÀÛ¾÷ÇÑ´Ù.  
 */ 
int setup_sigio(int fd) 
{ 
    if (fcntl(fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC) < 0) 
    { 
        printf("Couldn't setup nonblocking io %d\n", fd); 
        return -1; 
    } 
    if (fcntl(fd, F_SETSIG, SIGRTMIN) < 0) 
    { 
        printf("Couldn't set signal %d on %d\n", SIGRTMIN, fd); 
        return -1; 
    }     
    if (fcntl(fd, F_SETOWN, getpid()) < 0) 
    { 
        printf("Couldn't set owner %d on %d\n", getpid(), fd); 
        return -1; 
    } 
    return 0; 
} 
 
/* 
 * setup_sigio()¿¡ ´ëÇÑ Æ÷ÀåÇÔ¼ö 
 */ 
void setup_sigio_listeners(fd) 
{ 
    if (setup_sigio(fd) != 0) 
    { 
        printf("setup_sigio_listners error : %d\n", fd); 
        exit(0); 
    } 
    else 
    { 
    } 
} 
 
/* 
 * ÇØ´ç Æ÷Æ®¸¦ ÀÌ¿ëÇØ¼­  
 * UDP¼ÒÄÏÀ» ÀÛ¼ºÇϰí 
 * ¼ÒÄÏ ÁöÁ¤ÀÚ¸¦ ¸®ÅÏÇÑ´Ù. 
 */ 
int get_listener_fd(int port) 
{ 
    int sockfd; 
    int clilen; 
    int state; 
    struct sockaddr_in serveraddr; 
 
    clilen = sizeof(serveraddr); 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0) 
    { 
        printf("Socket create error\n"); 
        exit(0); 
    } 
    serveraddr.sin_family = AF_INET; 
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serveraddr.sin_port = htons(port); 
 
    state = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); 
    if (state == -1) 
    { 
        perror("bind error : "); 
        exit(0); 
    } 
 
    return sockfd; 
} 
 
int main() 
{ 
    struct siginfo si;  
    sigset_t set; 
    int ret; 
    int resockfd; 
    int sockfd1, sockfd2; 
    struct data add_data; 
    struct sockaddr_in clientaddr;  
    int clilen; 
 
    // 1. 
    // ¸®¾ó ŸÀӽñ׳ο¡ ´ëÇØ¼­ SIG_BLOCK·Î  
    // ÀÛµ¿Çϵµ·Ï ¼³Á¤ÇÑ´Ù.  
    sigemptyset(&set); 
    sigaddset(&set, SIGRTMIN);  
    sigprocmask(SIG_BLOCK, &set, NULL); 
 
    // 2. 
    // Æ÷Æ®¹øÈ£ 1234, 1235·Î 2°³ÀÇ UDP ¼ÒÄÏÀ»  
    // ¸¸µé°í ÀÌµé ¼ÒÄÏÀÌ RTS¿¡ ´ëÀÀÇϵµ·Ï ÇÑ´Ù.  
    sockfd1 = get_listener_fd(1234); 
    setup_sigio_listeners(sockfd1); 
 
    sockfd2 = get_listener_fd(1235); 
    setup_sigio_listeners(sockfd2); 
 
    while(1) 
    { 
        clilen = sizeof(clientaddr); 
 
        // 3. RTS¸¦ ±â´Ù¸°´Ù.   
        printf("Sig wait\n");     
        ret = sigwaitinfo(&set, &si); 
 
        // 4. 
        // ¸¸¾à RTS°¡ µµÂøÇß´Ù¸é 
        // siginfo±¸Á¶Ã¼ÀÇ °ªÀ» °Ë»çÇØ¼­ ¾î´À ¼ÒÄÏÀ¸·Î ºÎÅÍ  
        // µ¥ÀÌÅͰ¡ ¿Ô´ÂÁö È®ÀÎÇϰí, ÇØ´ç ¼ÒÄÏÀ» ÅëÇØ  
        // Ŭ¶óÀÌ¾ðÆ®¿Í Åë½ÅÇÑ´Ù.   
        if(ret == SIGRTMIN) 
        { 
            // select¸¦ ¾²Áö ¾Ê°íµµ À̺¥Æ®°¡ ¹ß»ýÇÑ  
            // ¼ÒÄÏÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. 
            printf("=========================\n"); 
            printf("RTS I/O socket  %d\n", si.si_fd); 
            printf("RTS I/O revents %d\n", si.si_band); 
            printf("=========================\n"); 
            resockfd = si.si_fd; 
            recvfrom(resockfd, (void *)&add_data, sizeof(add_data), 0,  
                            (struct sockaddr *)&clientaddr, &clilen); 
            add_data.sum = add_data.a + add_data.b;  
            sendto(resockfd, (void *)&add_data, sizeof(add_data), 0, 
                            (struct sockaddr *)&clientaddr, clilen); 
            // 5. 
            // µð¹ö±ë¿ë : Çʿ信 µû¶ó ÁÖ¼®À» Ç®°í Å×½ºÆ® ÇØº»´Ù.  
            // printf("sleep\n"); 
            // sleep(10); 
        } 
    } 
} 
 
            </screen> 
        </para> 
        <para> 
            <emphasis>1</emphasis>.¿¡¼­ RTS¸¦ »ç¿ëÇϵµ·Ï ¼¼ÆÃÇÑ´Ù.  
            sigaddset()¸¦ ÀÌ¿ëÇØ¼­ RTS¸¦  
            ´ëÀÀÇϵµ·Ï ¼³Á¤ÇÑ´Ù. ±×ÈÄ sigprocmask()¸¦ ÀÌ¿ëÇØ¼­ µ¿ÀÏÇÑ RTS°¡  
            µé¾î¿ÔÀ» °æ¿ì ÀÎÅÍ·´Æ®°¡ °É¸®Áö ¾Ê°í ºí·°µÇµµ·Ï ¼³Á¤ÇÑ´Ù.  
            ¸¸¾à sigprocmask()¸¦ ÀÌ¿ëÇØ¼­ RTS¸¦ ºí·°ÇÏÁö ¾Ê´Â´Ù¸é  
            sigwaitinfo()°¡ È£ÃâµÇ¾î¼­ RTS¸¦ ±â´Ù¸®±â Àü¿¡ RTS°¡ ÇÁ·Î¼¼½º·Î  
            Àü´ÞµÉ°æ¿ì ÇÁ·Î¼¼½º¿¡ ÀÎÅÍ·´Æ®°¡ °É¸®°í ÇÁ·Î¼¼½º´Â Á¾·áµÇ¾î ¹ö¸±  
            °ÍÀÌ´Ù.     
        </para> 
        <para> 
            À¯´Ð½º Ç¥ÁØ ½Ã±×³Î¿¡¼­´Â ½Ã±×³ÎÀÌ ºí·°µÉ °æ¿ì ÇϳªÀÇ ½Ã±×³Î¸¸  
            À¯ÁöÇÏ°í ³ª¸ÓÁö ½Ã±×³ÎÀº ¸ðµÎ ÀÒ¾î ¹ö¸®Áö¸¸ RTS´Â ºí·°µÇ´õ¶óµµ  
            ½Ã±×³ÎÀÇ ¿­À» À¯ÁöÇÑ´Ù. ½ÇÁ¦ À¯ÁöµÇ´ÂÁö´Â Àá½Ã ÈÄ¿¡ Å×½ºÆ®  
            ÇØº¸µµ·Ï ÇϰڴÙ.    
        </para> 
        <para> 
            <emphasis>2</emphasis>.¿¡¼­ 2°³ÀÇ UDP¼ÒÄÏÀ» ¸¸µé¾î¼­  
            °¢°¢ÀÇ ¼ÒÄÏ¿¡ ´ëÇØ¼­ setup_sigio_listeners()¸¦ ÀÌ¿ëÇØ¼­ RTS¿¡  
            ´ëÀÀÇϵµ·Ï ¸¸µé¾ú´Ù. ÆÄÀÏ¿¡ ´ëÇÑ RTS´ëÀÀ¿¡´Â fcntl()ÀÌ ¸Å¿ì  
            Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù.  
        </para> 
        <para> 
            <emphasis>3</emphasis>.¿¡¼­ sigwaitinfo()¸¦ ÀÌ¿ëÇØ¼­ RTS¸¦ ±â´Ù¸°´Ù.      
            ¸¸¾à UDP¼ÒÄÏ¿¡ À̺¥Æ®°¡ ¹ß»ýÇϸé RTS°¡ Àü´Þ µÇ°í, sigwaitinfo()´Â  
            ¸®ÅÏÇÏ°Ô µÈ´Ù. ¸®ÅÏÇÒ¶§ 2¹øÂ° ÀÎÀÚÀÎ si(siginfo)¸¦ ä¿öÁÖ°Ô µÇ´Âµ¥,  
            siginfo¿¡´Â À̺¥Æ® ¹ß»ýÇÑ ÆÄÀϰú À̺¥Æ® Á¤º¸µîÀÌ ´ã°ÜÁ® ÀÖ´Ù.   
        </para> 
        <para> 
            <emphasis>4</emphasis>.¿¡¼­ siginfo±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ÀÌ¿ëÇØ¼­  
            ¾î´À ¼ÒÄÏÀ¸·Î ¾î¶² À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö È®ÀÎÇÒ ¼ö ÀÖÀ¸¸ç,  
            recvfrom(), sendto()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅÍ Åë½ÅÀ» ÇÏ¸é µÈ´Ù.   
        </para> 
        <para> 
            <emphasis>5</emphasis>.´Â µð¹ö±ë¿ëÀÌ´Ù.  
            sleep()¸¦ °É¾î ³õ°í 10ÃÊ »çÀÌ¿¡ 2¹ø ÀÌ»ó Ŭ¶óÀÌ¾ðÆ®¸¦ ÀÌ¿ëÇØ¼­  
            µ¥ÀÌÅÍ Åë½Å Å×½ºÆ®¸¦ ÇØº¸¸é ½Ã±×³ÎÁ¤º¸°¡ ´ë±â¿­¿¡ ½×ÀÌ´Â °ÍÀ»  
            È®½ÇÈ÷ È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.       
        </para> 
    </section> 
    <section id="rtsipc"> 
        <title>ÇÁ·Î¼¼½º°£ ½ÅÈ£Àü´Þ</title> 
        <para> 
            RTS´Â ÆÄÀÏ¿¡ ´ëÇÑ À̺¥Æ® Àü´ÞÀ» À§ÇÑ ÁÁÀº µµ±¸À̸ç, ½ÇÁ¦·Î °ÅÀÇ ´ëºÎºÐ  
            ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ µµ±¸·Î »ç¿ëµÇÁö¸¸ ÇÁ·Î¼¼½º°£ ½ÅÈ£ Àü´ÞÀ» À§ÇÑ  
            ¸ñÀûÀ¸·Îµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.  
        </para> 
        <para> 
            ÇÁ·Î¼¼½º°£ ½ÅÈ£Àü´Þ¿ëÀ¸·Î »ç¿ëÇÒ ¶§ ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ½Ã±×³ÎÀÌ ´ë±â¿­¿¡  
            ½×À̹ǷΠÀÒ¾î¹ö¸± ¿°·Á°¡ ¾ø´Ù´Â Á¡°ú ºÎ°¡ÀûÀÎ Á¤º¸¸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù´Â Á¡ÀÌ´Ù.   
            ´Ù¸¥ ÇÁ·Î¼¼½º·ÎÀÇ RTSÀü´ÞÀº <emphasis>sigqueue(2)</emphasis>ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.  
        </para> 
        <para> 
            ºÎ°¡ÀûÀÎ Á¤º¸ÀÇ Àü´ÞÀº sifinfo_t±¸Á¶Ã¼ÀÇ sigvalue¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù.  
            sigvalue´Â ´ÙÀ½°ú °°Àº ¸â¹ö¸¦ °¡Áø´Ù.   
            <screen> 
union sigval 
{ 
    int sival_int; 
    void *sival_ptr; 
} 
            </screen> 
            sival_int´Â intÇü °ªÀ» Àü´ÞÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ¸Þ´º¾óÀ» º¸¸é sival_ptrÀÇ  
            °æ¿ì ÁÖ¼Ò°ªÀ» Àü´ÞÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù°í µÇ¾îÀִµ¥, ½ÇÁ¦ ¾îµð¿¡ »ç¿ë°¡´ÉÇÑÁö  
            È®ÀÎ ÇÒ ¼ö ¾ø¾ú´Ù. ¾Æ´Â »ç¶÷ÀÌ ÀÖÀ¸¸é ´ñ±ÛÀ» ´Þ¾ÆÁֱ⠹ٶõ´Ù.   
        </para> 
        <para> 
            RTS¿¡ ´ëÀÀÇϵµ·Ï ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µå´Â ¹æ¹ýÀº ÀÏ¹Ý À¯´Ð½º Ç¥ÁØ ½Ã±×³ÎÀ»  
            ´Ù·ç´Â ÇÁ·Î±×·¥°ú Å©°Ô ´Ù¸¦¹Ù ¾ø´Ù.  
            sigactionÀÇ sa_flags¸¦ SA_SIGINFO·Î ¼³Á¤Çϰí Àû´çÇÑ ½Ã±×³Î Çڵ鷯¸¦  
            µî·ÏÇϱ⸸ ÇÏ¸é µÈ´Ù. ±×¸®°í RTS°¡ Àü´ÞµÇ¾úÀ» °æ¿ì si_code°¡ SI_QUEUEÀÎÁö¸¦  
            È®ÀÎÇÏ°í ¿øÇÏ´Â ÀÛ¾÷À» ÇÏ¸é µÈ´Ù. SI_QUEUEÀÎÁö¸¦ È®ÀÎÇÏ´Â ÀÌÀ¯´Â  
            RTS°¡ ¾Æ´Ñ Ç¥ÁØ ½Ã±×³ÎÀÌ µµÂøÇÒ ¼ö ÀÖ°í, À̸¦ ±¸º°Çؼ­ ÀÛ¾÷ÇØ¾ßÇÒ  
            Çʿ䰡 Àֱ⠶§¹®ÀÌ´Ù.  
            ´ÙÀ½Àº RTS¿¡ ¹ÝÀÀÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ´Ù.    
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : rcv_rts.c</emphasis> 
            <screen> 
#include <signal.h> 
#include <stdio.h> 
#include <unistd.h> 
 
/*  
 * ½Ã±×³Î Çڵ鷯 
 * si_code°¡ SI_QUEUE ÀÎÁö¸¦ È®ÀÎÇÑÈÄ ¿øÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù.   
 * SI_QUEUEÀÏ °æ¿ì RTSÇü½ÄÀ¸·Î Àü´ÞµÈ ½Ã±×³ÎÀÌ¸ç  
 * ±×·¸Áö ¾ÊÀ»°æ¿ì Ç¥ÁØ À¯´Ð½º ½Ã±×³ÎÀÌ´Ù.   
 */ 
void sighandler(int signo, siginfo_t *si) 
{ 
    if(si->si_code == SI_QUEUE) 
    { 
        printf("User RTS signal %d\n", si->si_pid); 
        printf("Sig  Number %d\n",     si->si_signo); 
        printf("User Data is %d\n",    si->si_value.sival_int); 
        // ½Ã±×³ÎÀÌ Å¥À׵ǴÂÁö È®ÀÎÇϱâ À§ÇÑ ÄÚµå 
        getchar(); 
    } 
    else 
    { 
        // killµîÀ» ÀÌ¿ëÇØ¼­ Ç¥ÁØ À¯´Ð½º ½Ã±×³ÎÀ» º¸³ÂÀ» °æ¿ì 
        // ½ÇÇàµÇ´Â ·çƾ  
        printf("Get none realtime signal %d\n", signo);  
    } 
} 
 
int main() 
{ 
    struct sigaction sigact; 
 
    printf("My pid %d\n", getpid()); 
 
    /* 
     * sa_flags¸¦ SA_SIGINFO·Î ¼³Á¤Ç졒  
     * ½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇÑ´Ù.  
     */ 
    sigemptyset(&sigact.sa_mask); 
    sigact.sa_flags     = SA_SIGINFO; 
    sigact.sa_restorer  = NULL;  
    sigact.sa_sigaction = sighandler;  
 
    /* 
     * RTS½Ã±×³Î¿¡ ´ëÇÑ Çڵ鷯¸¦ ¼³Ä¡ÇÑ´Ù.   
     */ 
    if (sigaction(SIGRTMIN, &sigact, 0) == 1) 
    { 
        printf("signal error\n"); 
        exit(0); 
    }    
    while(1) 
    { 
        sleep(1); 
    }    
}    
            </screen> 
        </para> 
        <para> 
            ´ÙÀ½Àº RTS¸¦ ¹ß»ý½ÃŰ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.     
        </para> 
        <para> 
            <emphasis>¿¹Á¦ : snd_rts.c</emphasis> 
            <screen> 
#include <signal.h> 
#include <stdio.h> 
 
/* 
 * argv[1]Àº º¸³»°íÀÚ ÇÏ´Â ÇÁ·Î¼¼½ºÀÇ PID   
 * argv[2]´Â º¸³»°íÀÚ ÇÏ´Â °ªÀÌ´Ù.    
 * SIGUSR1À» RTS·Î Àü¼ÛÇÑ´Ù.  
 */   
int main(int argc, char **argv) 
{ 
    union sigval sv; 
 
    sv.sival_int = atoi(argv[2]); 
    sigqueue(atoi(argv[1]), SIGRTMIN, sv); 
} 
            </screen> 
            ÀÌÁ¦ rcv_rts¸¦ ¶ç¿ì°í ³ª¼­ snd_rts·Î Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù.  
            snd_rts·Î Å×½ºÆ® ÇßÀ»°æ¿ì RTS¸¦ ¹Þ´Â°É È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. rcv_rts¿¡¼­  
            Űº¸µåÀÔ·ÂÀÌ ¾ø´Ù¸é getchar()¿¡¼­ ºí·°µÉ °Çµ¥, À̶§ snd_rts¸¦ ¿©·¯¹ø  
            ½ÇÇàÇÏ¸é ½Ã±×³ÎÀÌ ´ë±â¿­¿¡ ½×À̴ Ư¼ºµµ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.   
        </para> 
        <para> 
            ±×·¸Áö ¾Ê°í killÀ» ÀÌ¿ëÇØ¼­ Ç¥ÁØ À¯´Ð½º ½Ã±×³ÎÀ» º¸³¾¼öµµ Àִµ¥,   
            ±×·² °æ¿ì Ç¥ÁØ À¯´Ð½º ½Ã±×³Î ó¸® ·çƾÀ¸·Î ³Ñ¾î°¡´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.    
        </para> 
    </section> 
</section> 
<section> 
    <title>°á·Ð</title> 
    <para> 
        ÀÌ»ó RTS¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼­ ´Ù·é³»¿ëÀº ¸»±×´ë·Î RTSÀÇ  
        °³³äÀÌÇØ¸¦ À§ÇÑ ¸Àº¸±âÀÏ »ÓÀÌ´Ù.  
        ½ÇÁ¦ RTS¸¦ ÀÀ¿ëÇÑ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀÇ ÀÛ¼º¿¡´Â ½Å°æ½áÁà¾ß ÇÒ  
        ¸¹Àº ¹®Á¦µéÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ ³»¿ëµéÀº ´ÙÀ½ ¹®¼­¸¦ ÅëÇØ ´Ù·çµµ·Ï ÇÒ°ÍÀÌ´Ù.   
    </para> 
</section> 
 
</article> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.