Real-Time Signal ¼Ò°³ 1
ÃÑ ÆäÀÌÁö ¼ö : 3121

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>Network_Programing>AdvancedComm>RTS1


Real Time Signal

Real Time Signal

À± »ó¹è

yundream@www.joinc.co.kr

교정 과정
교정 1.12003³â 8¿ù 25ÀÏ 23½Ã
ÇÁ·Î¼¼½º°£ RTSÀü´Þ Ãß°¡
교정 1.02003³â 8¿ù 23ÀÏ 23½Ã
sigqueueÇÔ¼ö ¼³¸í Ãß°¡
교정 0.82003³â 8¿ù 13ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º

차례
1절. ¼Ò°³
2절. poll(2)À» ÀÌ¿ëÇÑ À̺¥Æ® ÅëÁö
2.1절. poll(2)ÀÇ ÀÎÅÍÆäÀ̽º
2.1.1절. poll(2)ÀÇ ¹®Á¦Á¡
3절. POSIX RTS
3.1절. RTS¶õ
3.2절. RTS¿Í Ç¥ÁØ ½Ã±×³Î(signal)°úÀÇ ºñ±³
3.3절. RTS ´ë±â¿­ÀÇ Å©±â
3.4절. RTS¿Í poll°úÀÇ ºñ±³
3.5절. RTSÁö¿ø È®ÀÎ
3.6절. RTS¸¦ ÀÌ¿ëÇÑ ³×Æ®¿öÅ© ÀÔÃâ·Â ó¸®
3.7절. RTS ³×Æ®¿öÅ© ¿¹Á¦ ÀÛ¼º
3.8절. ÇÁ·Î¼¼½º°£ ½ÅÈ£Àü´Þ
4절. °á·Ð

1절. ¼Ò°³

ÀÌ »çÀÌÆ®ÀÇ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °ü·Ã ¹®¼­µéÀ» ¸î°³ ÀÐ¾î º¸¾Ò´Ù¸é ºÐ¸í RealTime signal(ÀÌÇÏ RTS)¿¡ ´ëÇØ¼­ µé¾î º¸¾ÒÀ» °ÍÀÌ´Ù. Áö±Ý±îÁöÀÇ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼­ »ç¿ëµÇ¾ú´ø ±â¼úµéÀº polling±â¹ÝÀÌ¿´´Ù. Áï ¸Þ½ÃÁö°¡ µµÂøÇϱ⸦ °è¼Ó üũÇÏ´Â ¹æ½ÄÀ¸·Î ÀÔÃâ·ÂÀ» ó¸®ÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌ·¯ÇÑ ÀÔÃâ·Â¹æ½Ä(ÁÖ·Î select(2)¿Í poll(2) À» ÀÀ¿ëÇÑ)À¸·Îµµ ´ëºÎºÐÀÇ ³×Æ®¿öÅ© ÀÔÃâ·ÂÀ» ó¸®Çϱ⿡´Â ÃæºÐÇÏÁö¸¸ ÃÖ±Ù ÀÎÅͳݻ󿡼­ ó¸®ÇؾßÇÒ µ¥ÀÌÅÍÀÇ ¾çÀÌ ´Ã¾î³²¿¡ µû¶ó ¸î¸î °æ¿ì¿¡ À־ °íÀüÀûÀÎ ¹æ¹ýÀ¸·Î ÇѰ踦 µå·¯³»°Ô µÇ¾ú´Ù.

±×·¡¼­ Á¦¾ÈµÈ ¹æ¹ýÀÌ RTS¸¦ ÀÌ¿ëÇÑ ½Ã±×³Î ±â¹ÝÀÇ ÀÔÃâ·Â ó¸® ±â¹ýÀÌ´Ù. RTS´Â ½Ã±×³ÎÀÇ È®ÀåÆÇÀÌ´Ù. ±âÁ¸ÀÇ ½Ã±×³ÎÀÌ Å¥À×ÀÌ µÇÁö ¾ÊÀ¸¸ç, Àü´Þ µÇ¾úÀ» ¶§ ¾Æ¹«·± Á¤º¸¸¦ ¾Ë·ÁÁÖÁö ¾Ê´Â ¹Ý¸é RTS´Â ½Ã±×³Î ó·³ (°ÅÀÇ) ½Ç½Ã°£¿¡ Àü´ÞµÇ¸ç ÀÔÃâ·Â µ¥¾îÅÍÀÇ ¿øÇÒÇÑ Ã³¸®¸¦ À§ÇÑ ÇÊ¿äÇÑ Á¤º¸µé±îÁö ÇÔ²² Àü´ÞÇÑ´Ù. °Ô´Ù°¡ ½Ã±×³ÎÀÇ ´ë±â¿­(Å¥)¸¦ À¯ÁöÇØ¼­ ¿©·¯°³ÀÇ ½Ã±×³ÎÀÌ ÂªÀº ½Ã°£¿¡ µµÂøÇÏ´õ¶óµµ ½Ã±×³ÎÀ» ÀÒ¾î ¹ö¸®´Â ¹®Á¦¸¦ ÇØ°á Çß´Ù.

ÀÌ ¹®¼­´Â RTS¿¡ ´ëÇÑ °³³ä¼Ò°³¿Í ÀÀ¿ëÀ» ´ã°í ÀÖ´Ù. Ư¼º»ó poll(2)¿Í °°Àº ÇÔ¼ö¿Í ÀÚÁÖ ºñ±³µÉ °ÍÀÌ´Ù.


2절. poll(2)À» ÀÌ¿ëÇÑ À̺¥Æ® ÅëÁö

2.1절. poll(2)ÀÇ ÀÎÅÍÆäÀ̽º

³×Æ®¿öÅ© »ó¿¡¼­ÀÇ ¸¹Àº Ŭ¶óÀÌ¾ðÆ®·Î ºÎÅÍÀÇ µ¥ÀÌÅÍÀÇ Ã³¸®¸¦ À§Çؼ­ »ç¿ëµÇ´Â ÀüÅëÀûÀÎ ¹æ¹ýÀº select(2)³ª poll(2)À» ÀÌ¿ëÇØ¼­ ¼ÒÄÏ(ÆÄÀÏ)·Î ºÎÅÍÀÇ À̺¥Æ®¸¦ °Ë»çÇÏ´Â ¹æ¹ýÀÌ´Ù. ´ÙÀ½Àº poll(2)ÀÇ ÀϹÝÀûÀÎ ÀÎÅÍÆäÀ̽º ÀÌ´Ù.

/* 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);
			
´ë·«ÀûÀÎ ÀÛµ¿ ¹æ½ÄÀº pfds¿¡ µî·ÏµÈ ÆÄÀÏ(¼ÒÄÏ)¿¡ ¾î¶² À̺¥Æ®°¡ ÀÖ´ÂÁö °Ë»ç¸¦ ÇØ¼­, À̺¥Æ®°¡ ¹ß»ýµÇ¾ú´Ù¸é À̸¦ ¸®ÅÏÇÏ´Â ½ÄÀÌ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÁß¿¬°á¼­¹ö ¸¸µé±â (3)¸¦ Âü°íÇϱ⠹ٶõ´Ù.


2.1.1절. poll(2)ÀÇ ¹®Á¦Á¡

poll(2)ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ¸î °¡ÁöÀÇ ´ÜÁ¡À» °¡Áö°Ô µÇ°í, ÀÌ·¯ÇÑ ´ÜÁ¡µé ¶§¹®¿¡ µ¿½Ã¿¡ ¸¹Àº ¼öÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ´Ù·ç´Âµ¥ ºñÈ¿À²À̶ó´Â ¹®Á¦Á¡À» °¡Áö°Ô µÈ´Ù.

  • pool(2)½Ã½ºÅÛ ÄÝÀº À̺¥Æ®¸¦ ¹Þ±â À§Çؼ­ Ä¿³Î ½ºÆäÀ̽º¿¡¼­ À¯Àú ½ºÆäÀ̽º·Î À̺¥Æ®¸¦ º¹»çÇÑ´Ù. ±×¸®°í ¾÷µ¥ÀÌÆ®µÈ À̺¥Æ® ¸®½ºÆ®¸¦ À¯Àú ½ºÆäÀ̽º¿¡¼­ Ä¿³Î ½ºÆäÀ̽º·Î ´Ù½Ã º¹»çÇÑ´Ù. Áï ÇϳªÀÇ À̺¥Æ®¸¦ Àü´Þ¹Þ±â À§Çؼ­ 2¹øÀÇ º¹»ç°¡ ¹ß»ýÇÑ´Ù. ÀϹÝÀûÀ¸·Î º¹»ç´Â »ó´çÈ÷ ¸¹Àº ÀÚ¿øÀ» ¼Ò¸ðÇÑ´Ù.

  • Ä¿³Î°ú ¾îÇø®ÄÉÀÌ¼Ç ¾çÂÊ ¸ðµÎ À̺¥Æ®°¡ ¹ß»ýÇÑ ¼ÒÄÏÀ» °Ë»çÇϱâ À§Çؼ­ ¿­¸° ¼ÒÄϸðµÎ¸¦ °Ë»çÇØ¾ß ÇÑ´Ù.

  • º¸Åë ¿¬°áµÈ ¼ÒÄÏÁß¿¡¼­ ´Ü 10%¿¡¼­ 20%¸¸ÀÌ È°µ¿Çϰí ÀÖ´Â ¼ÒÄÏÀÌ´Ù. poll(2)Àº ÀÌ 10%¿¡¼­20%ÀÇ È°¼ºÈ­µÈ ¼ÒÄÏ, ±×Áß¿¡¼­µµ ´ÜÁö ¸î°³ÀÇ À̺¥Æ® ¹ß»ýÇÑ ¼ÒÄÏÀ» ã¾Æ³»±â À§Çؼ­ ¼ö½Ê ȤÀº ¼ö¹é°³ÀÇ ¼ÒÄÏÀ» µÚÁö´Â ÀÛ¾÷À» ¹Ýº¹ÇØ¾ß ÇÑ´Ù.


3절. POSIX RTS

ÀÌ·¯ÇÑ 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¿¡¼­´Â Á¤½ÄÀ¸·Î Áö¿øÇÒ °Í°°´Ù.

ÀÌ ¹®¼­¿¡¼­´Â ÇöÀç Á¤½ÄÀ¸·Î Áö¿øµÇ°í ÀÖ´Â RTS¸¸À» ¼³¸í ÇÒ °ÍÀÌ´Ù. ÀÌÇÏ RTS¶õ POSIX RTS¸¦ ĪÇÑ´Ù.


3.1절. RTS¶õ

RTS´Â ºñµ¿±â(asynchronous) À̺¥Æ®¸¦ Àü´ÞÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î ¸¸µé¾î Á³À¸¸ç, ÁÖ·Î ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀÌ¼Ç ÀÛ¼º½Ã ¼ÒÄÏ À̺¥Æ®¸¦ Å뺸Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. RTS´Â ³×Æ®¿öÅ© ÀÔÃâ·Â¿¡ À־ polling¿¡ ºñÇØ ¿ùµîÇÑ ¼º´É Çâ»óÀ» º¸ÀåÇØ ÁØ´Ù.

½Ã±×³ÎÀÇ ÀåÁ¡ÀÎ ½Ç½Ã°£¼ºÀ» À¯ÁöÇϸ鼭 ´ÜÁ¡ÀÎ ´ë±â¿­ºÎÀçÀÇ ¹®Á¦¸¦ ÇØ°áÇÑ Çâ»óµÈ ½Ã±×³Îµµ±¸¶ó°í ÀÌÇØÇÒ ¼ö ÀÖ´Ù.


3.2절. RTS¿Í Ç¥ÁØ ½Ã±×³Î(signal)°úÀÇ ºñ±³

RTS´Â ´ÙÀ½ÀÇ µÎ°¡Áö Á¡¿¡ À־ À¯´Ð½º Ç¥ÁØ ½Ã±×³Î°ú Å©°Ô ´Ù¸£´Ù.

  • À¯´Ð½º Ç¥ÁØ ½Ã±×³ÎÀº ½Ã±×³Î ¹ß»ý½Ã ´ÜÁö ½Ã±×³ÎÀÌ Àü´ÞµÇ¾ú´Ù´Â »ç½Ç°ú Àü´ÞµÈ ½Ã±×³ÎÀÇ ¹øÈ£¸¸À» ¾Ë ¼ö ÀÖ´Ù. ¹Ý¸é RTS´Â siginfo_t ±¸Á¶Ã¼¿¡ ½Ã±×³Î¿¡ °ü·ÃµÈ ¿©·¯°¡Áö Á¤º¸±îÁö ÇÔ²² Àü´Þ µÈ´Ù.

    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 
    					
    À§ÀÇ ±¸Á¶Ã¼¸¦ º¸¸é ½Ã±×³Î ¹øÈ£´Â ¹°·ÐÀ̰í, ¾î¶² ¼ÒÄÏ¿¡¼­ À̺¥Æ®¸¦ ¹ß»ý½ÃÄ×´ÂÁö¿¡ °üÇÑ ±âŸ ¿©·¯°¡Áö Á¤º¸µéÀ» °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. RTS¸¦ »ç¿ëÇÏ¸é ½Ã±×³Î°ú ÇÔ²² ÀÌ·¯ÇÑ ºÎ°¡ Á¤º¸µé±îÁö ÇÔ²² Àü´Þ ¹Þ´Â´Ù. ´ÙÀ½Àº siginfo_t¸â¹öµé¿¡ ´ëÇÑ »ó¼¼ ¼³¸íÀÌ´Ù.

    si_signo

    ½Ã±×³Î ¹øÈ£ÀÌ´Ù. ÀÌ ½Ã±×³Î ¹øÈ£´Â ½Ã±×³ÎÇڵ鷯¿¡µµ µ¿ÀÏÇÏ°Ô Àü´ÞµÈ´Ù.

    si_errno

    errno°ª

    si_code

    ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ ¾î¶²ÀÌÀ¯·Î ½Ã±×³ÎÀÌ ¹ß»ýÇß´ÂÁö °ü·ÃµÈ °ªÀÌ´Ù.

    표 1. SI_CODE Á¾·ù

    °ª¼³¸í
    SI_ASYNCIO¼ÒÄÏÀ¸·Î ºñµ¿±â ÀÔÃâ·Â À̺¥Æ® ¹ß»ý, °¡Àå °ü½ÉÀÖ¾î ÇÏ´Â ½Ã±×³ÎÀÌ´Ù.
    SI_QUEUEsigqueue()ÇÔ¼ö¸¦ ÅëÇÑ ½Ã±×³Î ¹ß»ý
    SI_TIMER½Ã°£ Ãʰú
    SI_USERkill()ÇÔ¼öµî¿¡ ÀÇÇÑ ½Ã±×³Î ¹ß»ý

    si_pid

    ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ ÇÁ·Î¼¼½ºÀÇ ¾ÆÀ̵ð(PID)

    si_uid

    ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ ÇÁ·Î¼¼½ºÀÇ UID·Î si_code°¡ SI_USERÀÏ °æ¿ì¿¡¸¸ °ªÀÌ ¼³Á¤µÈ´Ù.

    si_status

    ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼­ SIGCHLD½Ã±×³ÎÀÌ ¹ß»ý½Ã۰í Á¾·áÇßÀ» °æ¿ì ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á¾·á°ª

    si_value

    sigqueue()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ½Ã±×³ÎÀ» ¹ß»ý½Ãų °æ¿ì »ç¿ëÀÚ°¡ º¸³½ °ªÀÌ ÀúÀåµÇ¾î ÀÖ´Ù.

    typedef union sigval
    {
        int sival_int;
        void *sival_ptr;
    } sigval_t;
    								

    si_addr

    ¸Þ¸ð¸® ÂüÁ¶ÁÖ¼ÒÀÇ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÑ´Ù. À̰ÍÀº SIGSEGV, SIGBUS, SIGILL, SIGFPE µîÀÌ ¹ß»ýÇßÀ» ¶§¸¸ Àû¿ëµÈ´Ù.

    si_fd

    À̺¥Æ®¸¦ ¹ß»ý½ÃŲ ÆÄÀÏÁöÁ¤ÀÚ.

  • Ç¥ÁØ ½Ã±×³ÎÀº ½Ã±×³ÎÀÇ ´ë±â¿­À» À¯ÁöÇÒ ¼ö ¾ø´Ù. ¸¸¾à ½Ã±×³ÎÇڵ鷯°¡ ¸®ÅϵDZâÀü¿¡ ¿©·¯°³ÀÇ µ¿ÀÏÇÑ ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù¸é ±× Áß ÇϳªÀÇ ½Ã±×³Î¸¸ Àü´ÞµÉ »ÓÀÌ´Ù. ³ª¸ÓÁö ½Ã±×³ÎÀº ÀÒ¾î ¹ö¸°´Ù. ¹Ý¸é RTS´Â ½Ã±×³ÎÀÇ ´ë±â¿­À» À¯ÁöÇÒ ¼ö ÀÖÀ¸¹Ç·Î, µ¿½Ã¿¡ ¿©·¯°³ÀÇ ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù°í ÇÏ´õ¶óµµ À̵éÀ» ´ë±â¿­¿¡ ´ã¾ÆµÑ ¼ö ÀÖ´Ù.


3.3절. RTS ´ë±â¿­ÀÇ Å©±â

¾ÆÁ÷ Å×½ºÆ® ÇØº¸Áø ¾Ê¾ÒÁö¸¸ ÀÌ·ÐÀûÀ¸·Î³ª¸¶ RTS´Â ´ë±â¿­À» °¡Áú ¼ö ÀÖ´Ù°í ¹è¿ü´Ù. ±×·¸´Ù¸é RTS´ë±â¿­ÀÇ Å©±â°¡ ¾î´ÀÁ¤µµ ÀÎÁö ±Ã±ÝÇÒ °ÍÀÌ´Ù. ¸¸¾à RTS´ë±â¿­ÀÇ Å©±â°¡ ÃæºÐÈ÷ Å©Áö ¾Ê´Ù¸é, ¹Ù»Û¼­¹öÀÇ °æ¿ì ºü¸¥½Ã°£¿¡ ´ë±â¿­ÀÌ °¡µæ Â÷¹ö¸®´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¿¡ ´ëÇØ¼­´Â ´ÙÀ½ ±â»ç¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.


3.4절. RTS¿Í poll°úÀÇ ºñ±³

¾ÕÀå¿¡¼­ poll¿¡ ´ëÇØ¼­ °£´ÜÈ÷ »ìÆìº¸¾Ò´Ù. poll°ú RTS¸ðµÎ À̺¥Æ®¸¦ ¹Þ¾Æ¼­ ó¸®ÇÑ´Ù´Â Á¡¿¡¼­´Â ¸Å¿ì ºñ½ÁÇÏÁö¸¸ ¼º´É¿¡¼­´Â ¸¹Àº Â÷À̰¡ ³­´Ù. poll¿¡¼­´Â ºó¹øÇÑ µ¥ÀÌÅÍ º¹»ç°¡ ÀϾ¸ç À̺¥Æ®°¡ ¹ß»ýÇÑ ÆÄÀÏÀ» ã±â À§Çؼ­ ¿­¸° ÆÄÀÏÀ» ¸ðµÎ °Ë»çÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ¿­¸° ÆÄÀÏÀÌ ¿­¸î°³ Á¤µµ¶ó¸é º°¹®Á¦ ¾ø°ÚÁö¸¸ ¼ö¹é¿¡¼­ õ¿¡ À°¹ÚÇÏ°Ô µÇ¸é À̺¥Æ®°¡ ¹ß»ýÇÑ ÆÄÀÏÀ» ã´Âµ¥ µå´Â ºñ¿ëµµ °áÄÚ ¹«½ÃÇÒ ¼ö ¾ø°Ô µÈ´Ù.

RTS´Â À̺¥Æ® ÅëÁö½Ã ¾î¶² ÆÄÀÏ¿¡ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö¿¡ ´ëÇÑ Á¤º¸±îÁö µÇµ¹·Á ÁֹǷΠºÎ°¡ÀûÀÎ ÀÛ¾÷¾øÀÌ ÇØ´çÆÄÀÏÀ» ÅëÇÑ ÀÛ¾÷ÀÌ °¡´ÉÇÏ´Ù.

그림 1. poll°ú RTS¿¡¼­ÀÇ ÆÄÀÏ À̺¥Æ® üũ


3.5절. RTSÁö¿ø È®ÀÎ

ÃÖ½ÅÀÇ ´ëºÎºÐÀÇ À¯´Ð½º ¿î¿µÃ¼Á¦µéÀº RTS¸¦ Áö¿øÇÑ´Ù. RTS¸¦ Áö¿øÇÏ´ÂÁö È®ÀÎÇÏ´Â °¡Àå È®½ÇÇÑ ¹æ¹ýÀº kill¸í·ÉÀ» ÀÌ¿ëÇØ¼­ Ä¿³Î¿¡¼­ Áö¿øÇÏ´Â ½Ã±×³Î ¸ñ·ÏÀ» È®ÀÎÇÏ´Â ¹æ¹ýÀÌ´Ù.

[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
			
1-31±îÁö´Â À¯´Ð½º Ç¥ÁØ ½Ã±×³ÎÀ» À§ÇØ ¿¹¾àµÈ ¿µ¿ªÀ̸ç, 32¹ø ºÎÅÍ 63¹ø ±îÁö°¡ RTS¸¦ À§ÇØ ¿¹¾àµÈ ¿µ¿ªÀÌ´Ù. RTS¸¦ À§ÇØ ¿¹¾àµÈ ½Ã±×³ÎÀÇ °¹¼ö´Â ¿î¿µÃ¼Á¦¸¶´Ù ¾à°£¾¿ Ʋ¸®´Ù. RTS¸¦ »ç¿ëÇϱ⠿øÇÑ´Ù¸é À̵é ÁغñµÈ ½Ã±×³ÎÁß Çϳª¸¦ »ç¿ëÇÏ¸é µÈ´Ù.


3.6절. RTS¸¦ ÀÌ¿ëÇÑ ³×Æ®¿öÅ© ÀÔÃâ·Â ó¸®

±×·³ RTS¸¦ ÀÌ¿ëÇØ¼­ ¼ÒÄÏ¿¡¼­ ¹ß»ýÇÑ À̺¥Æ®¸¦ ÅëÁö ¹Þ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸µµ·Ï ÇÏÀÚ.

°¡Àå ¸ÕÀú ÇØ¾ß ÇÒÀÏÀº ¼ÒÄÏÆÄÀÏÀÌ RTS¿¡ ¹ÝÀÀÇϵµ·Ï ¼³Á¤ÇÏ´Â ÀÏÀÌ´Ù. À̰ÍÀº ÆÄÀÏÆ¯¼ºÁ¶ÀÛ ÇÔ¼öÀÎ fcntl(2)À» ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. fcntl()ÇÔ¼ö¸¦ ÀÌ¿ë ÇØ´ç ¼ÒÄÏÀ» ³íºí·°,ºñµ¿±â ¸ðµå·Î ÀÛµ¿Çϵµ·Ï ¼¼ÆÃÇÑÈÄ, ½Ã±×³Î ¹øÈ£°¡ SIGRTMINº¸´Ù Ŭ°æ¿ì ÇØ´ç ¼ÒÄÏÀ¸·Î Àü´ÞµÇµµ·Ï ¼¼ÆÃÇÑ´Ù.

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);
			
¼ÒÄÏ¿¡ RTS°¡ ÅëÁöµÇµµ·Ï Çß´Ù¸é ¼ÒÄÏ¿¡ RTS°¡ ÅëÁöµÇ¾úÀ» ¶§ ÇÊ¿äÇÑ ÀÛ¾÷À» Çϵµ·Ï Äڵ带 Ãß°¡ÇÏ¸é µÈ´Ù. ÀÏ´ÜÀº RTS°¡ ÅëÁöµÇ¾ú´ÂÁö È®ÀÎÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. À¯´Ð½º´Â sigwaitinfo()¿Í sigtimedwait()ÇÔ¼ö¸¦ Á¦°øÇϸç, ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ RTSÅëÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
#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);
			
setÀº ±â´Ù¸± ½Ã±×³ÎÁ¤º¸°¡ ¼³Á¤µÇ´Â ±¸Á¶Ã¼À̸ç, ½Ã±×³ÎÀÌ ÅëÁö µÇ¸é ÇØ´ç Á¤º¸°¡ info¿¡ º¹»çµÈ´Ù. sigtimewait()´Â ±â´Ù¸®´Â ½Ã°£À» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â sigwaitinfo()¿Í ¿ÏÀüÈ÷ µ¿ÀÏ ÇÏ´Ù. ´ÙÀ½Àº À̵é ÇÔ¼ö¸¦ ÅëÇØ¼­ ½Ã±×³ÎÀ» ¹Þ°í ÇÊ¿äÇÑ ÀÏÀ» ó¸®ÇÏ´Â ÀüÇüÀûÀÎ ÄÚµåÀÇ ¸ð½ÀÀ» º¸¿©ÁØ´Ù.
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¸¦ ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÑ´Ù. 
}
			
´Ù¸¥ ÇÁ·Î¼¼½º·Î (nonrealtime)½Ã±×³ÎÀ» º¸³»±â À§Çؼ­ kill(2)À» »ç¿ëÇÒ ¼ö ÀÖ´Â °Íó·³ RTS¸¦ ´Ù¸¥ ÇÁ·Î¼¼½º·Î º¸³¾ ¼ö Àִµ¥, À̶§ »ç¿ëÇÏ´Â ÇÔ¼ö°¡ sigqueue(2)ÀÌ´Ù. º¸³»´Â Ãø¿¡¼­´Â 3¹øÂ° ÀÎÀÚÀÎ sgval¸¦ ÅëÇØ¼­ ºÎ°¡ÀûÀÎ Á¤º¸±îÁö ÇÔ²² Àü¼ÛÇÒ ¼ö ÀÖ´Ù. ÀÌ Á¡À» ÀÌ¿ëÇϸé IPC¿ëµµ·Îµµ »ç¿ë °¡´ÉÇÒ °ÍÀÌ´Ù. 3.8절¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°í ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.


3.7절. RTS ³×Æ®¿öÅ© ¿¹Á¦ ÀÛ¼º

±×·³ RTS¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. Áö±Ý±îÁö´Â RTSÀÇ ÀåÁ¡¿¡ ´ëÇØ¼­¸¸ ¾ê±â Çß¾ú´Âµ¥, RTS¿¡µµ ÇѰ¡Áö ´ÜÁ¡ÀÌ Àִµ¥, ±×°ÍÀº Á¦´ë·Î ´Ù·ç·Á¸é ²Ï º¹ÀâÇÑ ÄÚµù °úÁ¤À» °ÅÃÄ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î Á¦´ë·ÎµÈ RTSÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ·Á¸é ²Ï³ª ¸¹Àº ½Å°æ½á¾ß ÇҰ͵éÀÌ Á¸ÀçÇÑ´Ù.

À̹ø¿¹Á¦´Â ÀÌ·¯ÇÑ º¹ÀâÇÑ °úÁ¤À» Á¦¿ÜÇϰí RTSÀÇ ±â´ÉÀ» ¸Àº¸°í Å×½ºÆ®ÇÒ ¼ö ÀÖ´Â °£´ÜÇÑ ÀÀ¿ëÀ¸·Î ÇÒ °ÍÀÌ´Ù.

¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº UDP ÇÁ·Î±×·¡¹ÖÀÇ ±âÃÊ¿¡¼­ ´Ù·ç¾ú´ø µ¡¼À¿¬»ê ¼­¹ö ÇÁ·Î±×·¥À» RTS¸¦ ÀÌ¿ëÇØ¼­ ÀÛµ¿Çϵµ·Ï ÀçÀÛ¼ºÇϵµ·Ï ÇÒ °ÍÀÌ´Ù. Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥Àº ±×´ë·Î Àç»ç¿ë Çϵµ·Ï ÇϰڴÙ. ´Ù¸¸ ¿©±â¼­ Á¦ÀÛÇÏ´Â ¼­¹ö´Â RTSÀÇ Æ¯¼ºÀ» È®ÀÎÇϱâ À§Çؼ­ 2°³ÀÇ Æ÷Æ®¸¦ ¸¸µé°ÍÀÌ´Ù. ±×·¯¹Ç·Î Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥¿ª½Ã ¼­·Î ´Ù¸¥ Æ÷Æ®·Î Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ¾à°£ÀÇ ¼öÁ¤À» ÇØÁÖ¾î¾ß ÇÑ´Ù. Æ÷Æ®¹øÈ£¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­ ó¸®Çϵµ·Ï ¼öÁ¤ÇØ ÁÖ±â¹Ù¶õ´Ù.

ÄÚµå´Â ´Ü¼øÇÏÁö¸¸ Á¦´ë·Î ÀÌÇØÇϱâ À§Çؼ­´Â ½Ã±×³Î°ú ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ±âº»ÀûÀ¸·Î ÀÌÇØÇϰí ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·± ±âº»ÀûÀÎ ³»¿ëÀº ÀÌÇØÇϰí ÀÖ´Ù°í °¡Á¤ÇÏ°í ´ëºÎºÐÀÇ ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.

¿¹Á¦ : sum_server_rts.c

#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);
        }
    }
}

			

1.¿¡¼­ RTS¸¦ »ç¿ëÇϵµ·Ï ¼¼ÆÃÇÑ´Ù. sigaddset()¸¦ ÀÌ¿ëÇØ¼­ RTS¸¦ ´ëÀÀÇϵµ·Ï ¼³Á¤ÇÑ´Ù. ±×ÈÄ sigprocmask()¸¦ ÀÌ¿ëÇØ¼­ µ¿ÀÏÇÑ RTS°¡ µé¾î¿ÔÀ» °æ¿ì ÀÎÅÍ·´Æ®°¡ °É¸®Áö ¾Ê°í ºí·°µÇµµ·Ï ¼³Á¤ÇÑ´Ù. ¸¸¾à sigprocmask()¸¦ ÀÌ¿ëÇØ¼­ RTS¸¦ ºí·°ÇÏÁö ¾Ê´Â´Ù¸é sigwaitinfo()°¡ È£ÃâµÇ¾î¼­ RTS¸¦ ±â´Ù¸®±â Àü¿¡ RTS°¡ ÇÁ·Î¼¼½º·Î Àü´ÞµÉ°æ¿ì ÇÁ·Î¼¼½º¿¡ ÀÎÅÍ·´Æ®°¡ °É¸®°í ÇÁ·Î¼¼½º´Â Á¾·áµÇ¾î ¹ö¸± °ÍÀÌ´Ù.

À¯´Ð½º Ç¥ÁØ ½Ã±×³Î¿¡¼­´Â ½Ã±×³ÎÀÌ ºí·°µÉ °æ¿ì ÇϳªÀÇ ½Ã±×³Î¸¸ À¯ÁöÇÏ°í ³ª¸ÓÁö ½Ã±×³ÎÀº ¸ðµÎ ÀÒ¾î ¹ö¸®Áö¸¸ RTS´Â ºí·°µÇ´õ¶óµµ ½Ã±×³ÎÀÇ ¿­À» À¯ÁöÇÑ´Ù. ½ÇÁ¦ À¯ÁöµÇ´ÂÁö´Â Àá½Ã ÈÄ¿¡ Å×½ºÆ® ÇØº¸µµ·Ï ÇϰڴÙ.

2.¿¡¼­ 2°³ÀÇ UDP¼ÒÄÏÀ» ¸¸µé¾î¼­ °¢°¢ÀÇ ¼ÒÄÏ¿¡ ´ëÇØ¼­ setup_sigio_listeners()¸¦ ÀÌ¿ëÇØ¼­ RTS¿¡ ´ëÀÀÇϵµ·Ï ¸¸µé¾ú´Ù. ÆÄÀÏ¿¡ ´ëÇÑ RTS´ëÀÀ¿¡´Â fcntl()ÀÌ ¸Å¿ì Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù.

3.¿¡¼­ sigwaitinfo()¸¦ ÀÌ¿ëÇØ¼­ RTS¸¦ ±â´Ù¸°´Ù. ¸¸¾à UDP¼ÒÄÏ¿¡ À̺¥Æ®°¡ ¹ß»ýÇϸé RTS°¡ Àü´Þ µÇ°í, sigwaitinfo()´Â ¸®ÅÏÇÏ°Ô µÈ´Ù. ¸®ÅÏÇÒ¶§ 2¹øÂ° ÀÎÀÚÀÎ si(siginfo)¸¦ ä¿öÁÖ°Ô µÇ´Âµ¥, siginfo¿¡´Â À̺¥Æ® ¹ß»ýÇÑ ÆÄÀϰú À̺¥Æ® Á¤º¸µîÀÌ ´ã°ÜÁ® ÀÖ´Ù.

4.¿¡¼­ siginfo±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ÀÌ¿ëÇØ¼­ ¾î´À ¼ÒÄÏÀ¸·Î ¾î¶² À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö È®ÀÎÇÒ ¼ö ÀÖÀ¸¸ç, recvfrom(), sendto()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅÍ Åë½ÅÀ» ÇÏ¸é µÈ´Ù.

5.´Â µð¹ö±ë¿ëÀÌ´Ù. sleep()¸¦ °É¾î ³õ°í 10ÃÊ »çÀÌ¿¡ 2¹ø ÀÌ»ó Ŭ¶óÀÌ¾ðÆ®¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅÍ Åë½Å Å×½ºÆ®¸¦ ÇØº¸¸é ½Ã±×³ÎÁ¤º¸°¡ ´ë±â¿­¿¡ ½×ÀÌ´Â °ÍÀ» È®½ÇÈ÷ È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


3.8절. ÇÁ·Î¼¼½º°£ ½ÅÈ£Àü´Þ

RTS´Â ÆÄÀÏ¿¡ ´ëÇÑ À̺¥Æ® Àü´ÞÀ» À§ÇÑ ÁÁÀº µµ±¸À̸ç, ½ÇÁ¦·Î °ÅÀÇ ´ëºÎºÐ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ µµ±¸·Î »ç¿ëµÇÁö¸¸ ÇÁ·Î¼¼½º°£ ½ÅÈ£ Àü´ÞÀ» À§ÇÑ ¸ñÀûÀ¸·Îµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÇÁ·Î¼¼½º°£ ½ÅÈ£Àü´Þ¿ëÀ¸·Î »ç¿ëÇÒ ¶§ ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ½Ã±×³ÎÀÌ ´ë±â¿­¿¡ ½×À̹ǷΠÀÒ¾î¹ö¸± ¿°·Á°¡ ¾ø´Ù´Â Á¡°ú ºÎ°¡ÀûÀÎ Á¤º¸¸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù´Â Á¡ÀÌ´Ù. ´Ù¸¥ ÇÁ·Î¼¼½º·ÎÀÇ RTSÀü´ÞÀº sigqueue(2)ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.

ºÎ°¡ÀûÀÎ Á¤º¸ÀÇ Àü´ÞÀº sifinfo_t±¸Á¶Ã¼ÀÇ sigvalue¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. sigvalue´Â ´ÙÀ½°ú °°Àº ¸â¹ö¸¦ °¡Áø´Ù.

union sigval
{
    int sival_int;
    void *sival_ptr;
}
			
sival_int´Â intÇü °ªÀ» Àü´ÞÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ¸Þ´º¾óÀ» º¸¸é sival_ptrÀÇ °æ¿ì ÁÖ¼Ò°ªÀ» Àü´ÞÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù°í µÇ¾îÀִµ¥, ½ÇÁ¦ ¾îµð¿¡ »ç¿ë°¡´ÉÇÑÁö È®ÀÎ ÇÒ ¼ö ¾ø¾ú´Ù. ¾Æ´Â »ç¶÷ÀÌ ÀÖÀ¸¸é ´ñ±ÛÀ» ´Þ¾ÆÁֱ⠹ٶõ´Ù.

RTS¿¡ ´ëÀÀÇϵµ·Ï ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µå´Â ¹æ¹ýÀº ÀÏ¹Ý À¯´Ð½º Ç¥ÁØ ½Ã±×³ÎÀ» ´Ù·ç´Â ÇÁ·Î±×·¥°ú Å©°Ô ´Ù¸¦¹Ù ¾ø´Ù. sigactionÀÇ sa_flags¸¦ SA_SIGINFO·Î ¼³Á¤Çϰí Àû´çÇÑ ½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇϱ⸸ ÇÏ¸é µÈ´Ù. ±×¸®°í RTS°¡ Àü´ÞµÇ¾úÀ» °æ¿ì si_code°¡ SI_QUEUEÀÎÁö¸¦ È®ÀÎÇÏ°í ¿øÇÏ´Â ÀÛ¾÷À» ÇÏ¸é µÈ´Ù. SI_QUEUEÀÎÁö¸¦ È®ÀÎÇÏ´Â ÀÌÀ¯´Â RTS°¡ ¾Æ´Ñ Ç¥ÁØ ½Ã±×³ÎÀÌ µµÂøÇÒ ¼ö ÀÖ°í, À̸¦ ±¸º°Çؼ­ ÀÛ¾÷ÇØ¾ßÇÒ Çʿ䰡 Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½Àº RTS¿¡ ¹ÝÀÀÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ´Ù.

¿¹Á¦ : rcv_rts.c

#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);
    }   
}   
			

´ÙÀ½Àº RTS¸¦ ¹ß»ý½ÃŰ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.

¿¹Á¦ : snd_rts.c

#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);
}
			
ÀÌÁ¦ rcv_rts¸¦ ¶ç¿ì°í ³ª¼­ snd_rts·Î Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù. snd_rts·Î Å×½ºÆ® ÇßÀ»°æ¿ì RTS¸¦ ¹Þ´Â°É È®ÀÎ ÇÒ ¼ö ÀÖ´Ù. rcv_rts¿¡¼­ Űº¸µåÀÔ·ÂÀÌ ¾ø´Ù¸é getchar()¿¡¼­ ºí·°µÉ °Çµ¥, À̶§ snd_rts¸¦ ¿©·¯¹ø ½ÇÇàÇÏ¸é ½Ã±×³ÎÀÌ ´ë±â¿­¿¡ ½×À̴ Ư¼ºµµ È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.

±×·¸Áö ¾Ê°í killÀ» ÀÌ¿ëÇØ¼­ Ç¥ÁØ À¯´Ð½º ½Ã±×³ÎÀ» º¸³¾¼öµµ Àִµ¥, ±×·² °æ¿ì Ç¥ÁØ À¯´Ð½º ½Ã±×³Î ó¸® ·çƾÀ¸·Î ³Ñ¾î°¡´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


4절. °á·Ð

ÀÌ»ó RTS¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼­ ´Ù·é³»¿ëÀº ¸»±×´ë·Î RTSÀÇ °³³äÀÌÇØ¸¦ À§ÇÑ ¸Àº¸±âÀÏ »ÓÀÌ´Ù. ½ÇÁ¦ RTS¸¦ ÀÀ¿ëÇÑ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹ÖÀÇ ÀÛ¼º¿¡´Â ½Å°æ½áÁà¾ß ÇÒ ¸¹Àº ¹®Á¦µéÀÌ ÀÖ´Ù. ÀÌ·¯ÇÑ ³»¿ëµéÀº ´ÙÀ½ ¹®¼­¸¦ ÅëÇØ ´Ù·çµµ·Ï ÇÒ°ÍÀÌ´Ù.