ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>Real_Time_Signal
![]()
Tweet
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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|