ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>socketpair
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<article lang="ko">
<!-- -->
<!-- ¹®¼ Á¤º¸ -->
<!-- -->
<articleinfo>
<title>socketpairÀ» ÀÌ¿ëÇÑ IPC</title>
<author>
<surname>À± »ó¹è</surname>
<affiliation>
<address>
<email>yundream@joinc.co.kr</email>
</address>
</affiliation>
</author>
<revhistory>
<revision>
<revnumber>0.8</revnumber>
<date>2004³â 2¿ù 8ÀÏ 12½Ã</date>
<revremark>ÃÖÃÊ ¹®¼ÀÛ¼º</revremark>
</revision>
</revhistory>
</articleinfo>
<abstract>
<para>
socketpair()Àº ºñ±³Àû ´Ü¼øÇÑ ³»¿ëÀÌÁö¸¸ ±âÁ¸ IPC¿¡¼ »©¸Ô°í ´Ù·çÁö
¾Ê¾ÒÀ½À¸·Î º°µµ·Î ºÐ¸®Çؼ ´Ù·ç±â·Î Çß´Ù. ±âÁ¸¿¡ ´Ù·ç¾ú´ø IPC¿¡ ´ëÇÑ
³»¿ëµµ ´ã°í ÀÖÀ¸¹Ç·Î º¹½ÀÇÏ´Â Àǹ̿¡¼ õõÈ÷ Àо±â ¹Ù¶õ´Ù.
</para>
</abstract>
<!-- -->
<!-- ¼½¼Ç ½ÃÀÛ -->
<!-- -->
<section>
<title>¼Ò°³</title>
<para>
Áö±Ý±îÁö ºñ±³Àû ÃÖ½ÅÀ̶ó°í »ý°¢µÇ´Â SystemV IPC¿Í À¯´Ð½º Ãʱ⠺ÎÅÍ
»ç¿ëµÈ ¿À·¡µÈ ¿ª»ç¸¦ °¡Áø FIFO, pipe ±×¸®°í ¼ÒÄÏ·¹À̾¼ Á¦°øÇÏ´Â
Domain ¿µ¿ª ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½Å¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù.
</para>
<para>
¿©±â¿¡¼´Â À̵é IPC¿¡¼ Á¦¿ÜµÇ¾îÀÖ´ø socketpair(2)¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï
ÇϰڴÙ.
</para>
</section>
<section>
<title>socketpairÀ» ÀÌ¿ëÇÑ IPC</title>
<para>
À̹øÀå¿¡¼´Â socketpairÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æ º¼ °ÍÀÌ´Ù.
socketpairÀº pipe¿Í FIFO¿Í ¸Å¿ì ºñ½ÁÇÑ ÀÏÀ» ¼öÇàÇϴµ¥, socketpairÀ»
»ç¿ëÇÒ °æ¿ì ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡¿¡ ´ëÇØ¼µµ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.
</para>
<para>
¸¶Áö¸·¿¡´Â °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î¼ ÀÌÇØ¸¦ µ½µµ·Ï ÇϰڴÙ.
</para>
<section>
<title>pipe¿Í FIFOÀÇ ´ÜÁ¡</title>
<para>
pipe¿Í FIFO´Â À¯´Ð½º Ãʱ⿡ ¸¸µé¾î Á®¼ Áö±Ý±îÁö »ç¿ëµÇ°í ÀÖ´Â
¿À·¡µÈ ¿ª»ç¸¦ ÀÚ¶ûÇÏ´Â IPC¼³ºñ´Ù.
<emphasis>Simple is beautifule</emphasis>°¡ À¯´Ð½ºÀÇ Ã¶ÇÐÀÌ µÇµµ·Ï
Çϴµ¥ °¡Àå Å« ¿ªÈ°À» ÇÑ ¼³ºñ¶ó°í ÇÒ ¼ö ÀÖ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½º´Â
ÇÊ¿äÇÑ Àϵ鸸À» ´ã´çÇϸç, º¹ÀâÇÑ ÀÏÀº °¢°¢ÀÇ ÇÁ·Î¼¼½ºÀÇ
µ¥ÀÌÅ͸¦ <emphasis>ÆÄÀÌÇÁ</emphasis>·Î ¿¬°áÇØ¼ ÇØ°áÇÏ¿´´Ù.
</para>
<para>
ÀÌ·¸°Ô ÇØ¼ À¯´Ð½º´Â ÇÊ¿äÇÑ Àϸ¸´ã´çÇÏ´Â ¼ö¸¹Àº "ÀÛÀº" ÇÁ·Î¼¼½ºµéÀ»
ÅëÇØ¼ È¿À²ÀûÀ¸·Î °ü¸® µÉ ¼ö ÀÖ°Ô µÈ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½ºµéÀº
¹Ýµå½Ã ÇÊ¿äÇÑ ±â´É¸¸À» °¡Áö°í Àֱ⠶§¹®¿¡ ÁÖ¾îÁø ÀÏ¿¡ ´ëÇØ¼´Â
¸Å¿ì È¿À²ÀûÀ¸·Î ÀÛµ¿ÇÒ ¼ö ÀÖÀ¸¸ç, ¹®Á¦°¡ ¹ß»ýÇÒ È®·üµµ
¸Å¿ì Àû¾ú´Ù.
</para>
<para>
pipe¿Í FIFO´Â À¯´Ð½ºÀÇ ÀÌ·¯ÇÑ ÆÄÀÌÇÁ¸¦ Áö¿øÇÏ´Â È®½ÇÇÏ°íµµ
°£´ÜÇÑ ¹æ¹ýÀÌ´Ù. °ÅÀÇ À¯ÀÏÇÑ ´ÜÁ¡À̶ó°í »ý°¢µÇ´Â °ÍÀº ´Ü¹æÇâÀÇ
¿¬°á¸¸À» Áö¿øÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸¸¾à ºÎ¸ðÇÁ·Î¼¼½º¿¡¼ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦
¸¸µé°í À̸¦ pipe¸¦ ÅëÇØ¼ ¿¬°á Çß´Ù¸é ºÎ¸ð´Â Àбâ¿Í ¾²±âÁß
Çϳª¸¸ °¡´ÉÇÏ°Ô µÈ´Ù. ÀڽĿª½Ã ¸¶Âù°¡Áö·Î ¸¸¾à ºÎ¸ð°¡ ¾²±â Àü¿ë
À¸·Î ÆÄÀÌÇÁ¸¦ ¿¾ú´Ù¸é Àбâ Àü¿ëÀ¸·Î, ºÎ¸ð°¡ Àбâ Àü¿ëÀ¸·Î
ÆÄÀÌÇÁ¸¦ ¿¾ú´Ù¸é ¾²±â Àü¿ëÀ¸·Î ¿¾î¾ß¸¸ ÇÑ´Ù.
</para>
<para>
pipeÀÇ ÀÌ·¯ÇÑ ´Ü¹æÇ⼺Àº ÇÁ·Î¼¼½º°£ ¾ç¹æÇâ Åë½ÅÀÌ Áö¿øµÇ¾î¾ß
ÇÏ´Â °æ¿ì ¹®Á¦°¡ µÈ´Ù. ¹°·Ð pipe¸¦ 2¹ø »ç¿ëÇÔÀ¸·Î½á ÀÌ·¯ÇÑ
¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ±â´Â ÇÏÁö¸¸ Äڵ带 ÁöÀúºÐ ÇÏ°Ô ¸¸µç´Ù.
FIFO¿ª½Ã ÀÌ¿Í ºñ½ÁÇÑ ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.
</para>
<para>
´ÙÀ½Àº pipe¸¦ ÀÌ¿ëÇØ¼ ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ´ëÈÇÏ´Â °£´ÜÇÑ ¿¹Á¦
ÇÁ·Î±×·¥ÀÌ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â fork&exec¸¦ ÅëÇØ¼ ¿ÜºÎ ÇÁ·Î±×·¥À»
ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇà½ÃŰ°í ´ëÈÇÏ°Ô µÉ °ÍÀÌ´Ù.
</para>
<para>
<emphasis>pipe.c</emphasis>
<screen>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int pp[2];
int pid;
if (pipe(pp) < 0)
{
printf("pipe error:");
}
pid = fork();
if (pid < 0)
{
perror("fork error");
exit(0);
}
if (pid == 0)
{
close(pp[1]);
dup2(pp[0], 0);
if(execl("/home/mycvs/test/pipe_cl", "pipe_cl", 0) < 0)
{
perror("execl error");
}
}
else if (pid > 0)
{
close(pp[0]);
while(1)
{
sleep(1);
printf("Write\n");
write(pp[1], (void *)&pid, sizeof(pid));
}
}
}
</screen>
ÀÌ ÇÁ·Î±×·¥Àº ºÎ¸ð ÇÁ·Î¼¼½º·Î ÀÚ½Ä ÇÁ·Î¼¼½º·Î pipe_clÀ» ½ÇÇà½ÃŲ´Ù.
½ÇÇà ½ÃŲ ÀÚ½Ä ÇÁ·Î¼¼½º¿ÍÀÇ Åë½ÅÀ» À§Çؼ pipe()¸¦ ÀÌ¿ëÇØ¼
ÆÄÀÌÇÁ¸¦ »ý¼ºÇÑ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼ ÀÚ½Ä ÇÁ·Î¼¼½º·Î
µ¥ÀÌÅ͸¦ ¾²±â À§Çؼ dup2(2)¸¦ ÀÌ¿ëÇØ¼ Àбâ Àü¿ë ÆÄÀÌÇÁ pp[0]À»
0(Ç¥ÁØÀÔ·Â)À¸·Î º¹»çÇß´Ù. ÀÌÁ¦ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ¾²±â Àü¿ë ÆÄÀÌÇÁ
pp[1]·Î µ¥ÀÌÅ͸¦ ¾²¸é ÀÌ µ¥ÀÌÅÍ´Â ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Ç¥ÁØÀÔ·ÂÀ¸·Î
Àü´ÞµÈ´Ù. ´ÙÀ½Àº ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇà½Ãų pipe_cl.c ÇÁ·Î±×·¥ÀÇ
¼Ò½º ÄÚµå´Ù.
</para>
<para>
<emphasis>pip_cl.c</emphasis>
<screen>
#include <unistd.h>
int main()
{
int buf;
while(1)
{
read(0, (void *)&buf, sizeof(buf));
printf("read %d\n", buf);
}
}
</screen>
ºÎ¸ð ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ PID¸¦ ÀڽĿ¡°Ô Àü´ÞÇϰí ÀÚ½Ä ÇÁ·Î¼¼½º´Â
ÀÌ PID¸¦ Ãâ·ÂÇÑ´Ù.
</para>
<para>
¸¸¾à À§ÀÇ ÇÁ·Î¼¼½ºµéÀÌ ½Ö¹æÇâÀ¸·Î - ¿¹¸¦ µé¾î ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ ºÎ¸ð
ÇÁ·Î¼¼½ºÀÇ PID¸¦ ¹Þ°í ÀÚ½ÅÀÇ PID¸¦ ºÎ¸ð ÇÁ·Î¼¼½º¿¡°Ô Àü´Þ ÇÏ´Â -
Åë½ÅÇϱ⸦ ¿øÇÑ´Ù¸é pipe()¸¦ µÎ¹ø È£ÃâÇØ¼ ÀбâÀü¿ë°ú ¾²±âÀü¿ëÀÇ
µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ »ý¼ºÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¹¹ ¾î¶»°Ô º¸¸é ±×¸® º¹ÀâÇÏÁö
¾ÊÀº ÀÛ¾÷À̶ó°í »ý°¢ µÉ ¼ö ÀÖÁö¸¸ ¾Ö¸Å¸ðÈ£ÇÑ º¯¼ö¸í°ú ¸íÈ®ÇÏÁö
¾ÊÀº ÀÔÃâ·Â °ü°è ¶§¹®¿¡ ÁöÀúºÐÇÑ Äڵ尡 µÇ±â ½±´Ù.
</para>
</section>
<section>
<title>socketpairÀÇ »ç¿ë</title>
<para>
socketpair()¸¦ ÀÌ¿ëÇÏ¸é ¿¬°áµÈ ¼ÒÄÏÀÇ ½ÖÀ» »ý¼ºÇÑ´Ù. »ý¼ºµÈ
¼ÒÄÏ½Ö Áß Çϳª¸¦ ºÎ¸ð°¡ °¡Áö°í ´Ù¸¥ Çϳª¸¦ ÀڽĿ¡°Ô ³Ñ±â´Â
¹æ½ÄÀ¸·Î ¿¬°áÀ» ¸¸µé ¼ö ÀÖ´Ù. ¼ÒÄÏÀ̹ǷΠ´ç¿¬È÷ ÀüÀÌÁß Åë½ÅÀ»
Áö¿øÇÏ°Ô µÈ´Ù.
<screen>
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int d, int type, int protocol, int sv[2]);
</screen>
<emphasis>d</emphasis>´Â ¼ÒÄÏÀÇ µµ¸ÞÀÎ(¿µ¿ª)À» ÁöÁ¤Çϱâ À§Çؼ
»ç¿ëÇÑ´Ù. <emphasis>type</emphasis>¿Í <emphasis>protocol</emphasis>
¸¦ ÀÌ¿ëÇØ¼ ¼ÒÄÏÀÇ ºÎ°¡ÀûÀΠƯ¡À» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¸¸µé¾îÁø
¼ÒÄϽÖÀº <emphasis>sv</emphasis>¸¦ ÅëÇØ¼ ³Ñ¾î¿Â´Ù. ¸¸µé¾îÁø
¼ÒÄϽÖÀº ±¸ºÐÇÒ ¼ö ¾ø´Ù.
</para>
<para>
pipe.c¿Í pipe_cl.cÀÇ socketpair ¹öÁ¯À¸·Î Àбâ/¾²±â°¡ ¸ðµÎ °¡´ÉÇÑ
°ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡ ´ëÇÑ ¸ðµç ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇÑ´Ù.
</para>
<para>
<emphasis>¿¹Á¦ : socketpair.c</emphasis>
<screen>
#include <sys/types.h>
#include <sys/socket.h>
int main()
{
int sv[2];
int pid;
int mynum = 1;
// ¼ÒÄϽÖÀ» »ý¼ºÇÑ´Ù.
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0)
{
perror("socketpair error");
exit(0);
}
pid = fork();
if (pid < 0)
{
perror("fork error");
exit(0);
}
// exec¸¦ ÀÌ¿ëÇØ¼ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ´Ù.
if( pid == 0)
{
// ¼ÒÄϽÖÁß Çϳª¸¦ Ç¥ÁØÀÔ·ÂÀ¸·Î º¹»çÇÑ´Ù.
dup2(sv[0], 0);
// »ç¿ëµÇÁö ¾Ê´Â ¼ÒÄÏÀ» ´Ý´Â´Ù.
close(sv[1]);
close(sv[0]);
execl("/home/mycvs/test/pipe_cl", "pipe_cl", 0);
}
else if (pid > 0)
{
// ½îÄϽÖÁß »ç¿ëÇÏÁö ¾Ê´Â ¼ÒÄÏÀº ´Ý´Â´Ù.
close(sv[0]);
while(1)
{
write(sv[1], (void *)&mynum, sizeof(mynum));
sleep(1);
read(sv[1], (void *)&mynum, sizeof(mynum));
printf("num is %d\n", mynum);
}
}
}
</screen>
</para>
<para>
<emphasis>¿¹Á¦ : socketpair_cl.c</emphasis>
<screen>
#include <unistd.h>
int main()
{
int buf;
while(1)
{
// Ç¥ÁØÀÔ·ÂÀ¸·Î ºÎÅÍ °ªÀ» ÀÐ¾î µéÀ̰í
// ++ÇÑµÚ ¾´´Ù.
read(0, (void *)&buf, sizeof(buf));
buf++;
write(0, (void *)&buf, sizeof(buf));
}
}
</screen>
</para>
</section>
</section>
</article>
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|