socketpairÀ» ÀÌ¿ëÇÑ IPC
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



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

Contents

1 socketpairÀ» ÀÌ¿ëÇÑ IPC
1.1 pipe¿Í FIFOÀÇ ´ÜÁ¡
1.2 socketpairÀÇ »ç¿ë

socketpair()Àº ºñ±³Àû ´Ü¼øÇÑ ³»¿ëÀÌÁö¸¸ ±âÁ¸ IPC¿¡¼­ »©¸Ô°í ´Ù·çÁö ¾Ê¾ÒÀ½À¸·Î º°µµ·Î ºÐ¸®Çؼ­ ´Ù·ç±â·Î Çß´Ù. ±âÁ¸¿¡ ´Ù·ç¾ú´ø IPC¿¡ ´ëÇÑ ³»¿ëµµ ´ã°í ÀÖÀ¸¹Ç·Î º¹½ÀÇÏ´Â Àǹ̿¡¼­ õõÈ÷ Àо±â ¹Ù¶õ´Ù.

Áö±Ý±îÁö ºñ±³Àû ÃÖ½ÅÀ̶ó°í »ý°¢µÇ´Â SystemV IPC¿Í À¯´Ð½º Ãʱ⠺ÎÅÍ »ç¿ëµÈ ¿À·¡µÈ ¿ª»ç¸¦ °¡Áø FIFO(³×ÀÓµå ÆÄÀÌÇÁ), pipe±×¸®°í ¼ÒÄÏ·¹À̾¼­ Á¦°øÇÏ´Â Unix Domain ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½Å¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù.

¿©±â¿¡¼­´Â À̵é IPC¿¡¼­ Á¦¿ÜµÇ¾îÀÖ´ø socketpair(2)¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

1 socketpairÀ» ÀÌ¿ëÇÑ IPC

À̹øÀå¿¡¼­´Â socketpairÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¼ °ÍÀÌ´Ù. socketpairÀº pipe¿Í FIFO¿Í ¸Å¿ì ºñ½ÁÇÑ ÀÏÀ» ¼öÇàÇϴµ¥, socketpairÀ» »ç¿ëÇÒ °æ¿ì ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡¿¡ ´ëÇØ¼­µµ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.

¸¶Áö¸·¿¡´Â °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î¼­ ÀÌÇØ¸¦ µ½µµ·Ï ÇϰڴÙ.

1.1 pipe¿Í FIFOÀÇ ´ÜÁ¡

pipe¿Í FIFO´Â À¯´Ð½º Ãʱ⿡ ¸¸µé¾î Á®¼­ Áö±Ý±îÁö »ç¿ëµÇ°í ÀÖ´Â ¿À·¡µÈ ¿ª»ç¸¦ ÀÚ¶ûÇÏ´Â IPC¼³ºñ´Ù. Simple is beautifuleÀÌ À¯´Ð½ºÀÇ Ã¶ÇÐÀÌ µÇµµ·Ï Çϴµ¥ °¡Àå Å« ¿ªÈ°À» ÇÑ ¼³ºñ¶ó°í ÇÒ ¼ö ÀÖ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½º´Â ÇÊ¿äÇÑ Àϵ鸸À» ´ã´çÇϸç, º¹ÀâÇÑ ÀÏÀº °¢°¢ÀÇ ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌÅ͸¦ ÆÄÀÌÇÁ·Î ¿¬°áÇØ¼­ ÇØ°áÇÏ¿´´Ù.

ÀÌ·¸°Ô ÇØ¼­ À¯´Ð½º´Â ÇÊ¿äÇÑ Àϸ¸´ã´çÇÏ´Â ¼ö¸¹Àº "ÀÛÀº" ÇÁ·Î¼¼½ºµéÀ» ÅëÇØ¼­ È¿À²ÀûÀ¸·Î °ü¸® µÉ ¼ö ÀÖ°Ô µÈ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½ºµéÀº ¹Ýµå½Ã ÇÊ¿äÇÑ ±â´É¸¸À» °¡Áö°í Àֱ⠶§¹®¿¡ ÁÖ¾îÁø ÀÏ¿¡ ´ëÇØ¼­´Â ¸Å¿ì È¿À²ÀûÀ¸·Î ÀÛµ¿ÇÒ ¼ö ÀÖÀ¸¸ç, ¹®Á¦°¡ ¹ß»ýÇÒ È®·üµµ ¸Å¿ì Àû¾ú´Ù.

pipe¿Í FIFO´Â À¯´Ð½ºÀÇ ÀÌ·¯ÇÑ ÆÄÀÌÇÁ¸¦ Áö¿øÇÏ´Â È®½ÇÇÏ°íµµ °£´ÜÇÑ ¹æ¹ýÀÌ´Ù. °ÅÀÇ À¯ÀÏÇÑ ´ÜÁ¡À̶ó°í »ý°¢µÇ´Â °ÍÀº ´Ü¹æÇâÀÇ ¿¬°á¸¸À» Áö¿øÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸¸¾à ºÎ¸ðÇÁ·Î¼¼½º¿¡¼­ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé°í À̸¦ pipe¸¦ ÅëÇØ¼­ ¿¬°á Çß´Ù¸é ºÎ¸ð´Â Àбâ¿Í ¾²±âÁß Çϳª¸¸ °¡´ÉÇÏ°Ô µÈ´Ù. ÀڽĿª½Ã ¸¶Âù°¡Áö·Î ¸¸¾à ºÎ¸ð°¡ ¾²±â Àü¿ë À¸·Î ÆÄÀÌÇÁ¸¦ ¿­¾ú´Ù¸é Àбâ Àü¿ëÀ¸·Î, ºÎ¸ð°¡ Àбâ Àü¿ëÀ¸·Î ÆÄÀÌÇÁ¸¦ ¿­¾ú´Ù¸é ¾²±â Àü¿ëÀ¸·Î ¿­¾î¾ß¸¸ ÇÑ´Ù.

pipeÀÇ ÀÌ·¯ÇÑ ´Ü¹æÇ⼺Àº ÇÁ·Î¼¼½º°£ ¾ç¹æÇâ Åë½ÅÀÌ Áö¿øµÇ¾î¾ß ÇÏ´Â °æ¿ì ¹®Á¦°¡ µÈ´Ù. ¹°·Ð pipe¸¦ 2¹ø »ç¿ëÇÔÀ¸·Î½á ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ±â´Â ÇÏÁö¸¸ Äڵ带 ÁöÀúºÐ ÇÏ°Ô ¸¸µç´Ù. FIFO¿ª½Ã ÀÌ¿Í ºñ½ÁÇÑ ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.

´ÙÀ½Àº pipe¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ´ëÈ­ÇÏ´Â °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â fork&exec¸¦ ÅëÇØ¼­ ¿ÜºÎ ÇÁ·Î±×·¥À» ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇà½ÃŰ°í ´ëÈ­ÇÏ°Ô µÉ °ÍÀÌ´Ù.

#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));  
       }  
   }  
}  
 
ÀÌ ÇÁ·Î±×·¥Àº ºÎ¸ð ÇÁ·Î¼¼½º·Î ÀÚ½Ä ÇÁ·Î¼¼½º·Î pipe_clÀ» ½ÇÇà½ÃŲ´Ù. ½ÇÇà ½ÃŲ ÀÚ½Ä ÇÁ·Î¼¼½º¿ÍÀÇ Åë½ÅÀ» À§Çؼ­ pipe()¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÑ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼­ ÀÚ½Ä ÇÁ·Î¼¼½º·Î µ¥ÀÌÅ͸¦ ¾²±â À§Çؼ­ dup2(2)¸¦ ÀÌ¿ëÇØ¼­ Àбâ Àü¿ë ÆÄÀÌÇÁ pp[0]À» 0(Ç¥ÁØÀÔ·Â)À¸·Î º¹»çÇß´Ù. ÀÌÁ¦ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ¾²±â Àü¿ë ÆÄÀÌÇÁ pp[1]·Î µ¥ÀÌÅ͸¦ ¾²¸é ÀÌ µ¥ÀÌÅÍ´Â ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Ç¥ÁØÀÔ·ÂÀ¸·Î Àü´ÞµÈ´Ù. ´ÙÀ½Àº ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇà½Ãų pipe_cl.c ÇÁ·Î±×·¥ÀÇ ¼Ò½º ÄÚµå´Ù.

#include <unistd.h>  
 
int main()  
{  
   int buf;  
   while(1)  
   {  
       read(0, (void *)&buf, sizeof(buf));  
       printf("read %d\n", buf);  
   }  
}  
 

ºÎ¸ð ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ PID¸¦ ÀڽĿ¡°Ô Àü´ÞÇϰí ÀÚ½Ä ÇÁ·Î¼¼½º´Â ÀÌ PID¸¦ Ãâ·ÂÇÑ´Ù.

¸¸¾à À§ÀÇ ÇÁ·Î¼¼½ºµéÀÌ ½Ö¹æÇâÀ¸·Î - ¿¹¸¦ µé¾î ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼­ ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ PID¸¦ ¹Þ°í ÀÚ½ÅÀÇ PID¸¦ ºÎ¸ð ÇÁ·Î¼¼½º¿¡°Ô Àü´Þ ÇÏ´Â - Åë½ÅÇϱ⸦ ¿øÇÑ´Ù¸é pipe()¸¦ µÎ¹ø È£ÃâÇØ¼­ ÀбâÀü¿ë°ú ¾²±âÀü¿ëÀÇ µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ »ý¼ºÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¹¹ ¾î¶»°Ô º¸¸é ±×¸® º¹ÀâÇÏÁö ¾ÊÀº ÀÛ¾÷À̶ó°í »ý°¢ µÉ ¼ö ÀÖÁö¸¸ ¾Ö¸Å¸ðÈ£ÇÑ º¯¼ö¸í°ú ¸íÈ®ÇÏÁö ¾ÊÀº ÀÔÃâ·Â °ü°è ¶§¹®¿¡ ÁöÀúºÐÇÑ Äڵ尡 µÇ±â ½±´Ù.

1.2 socketpairÀÇ »ç¿ë

socketpair()¸¦ ÀÌ¿ëÇÏ¸é ¿¬°áµÈ ¼ÒÄÏÀÇ ½ÖÀ» »ý¼ºÇÑ´Ù. »ý¼ºµÈ ¼ÒÄÏ½Ö Áß Çϳª¸¦ ºÎ¸ð°¡ °¡Áö°í ´Ù¸¥ Çϳª¸¦ ÀڽĿ¡°Ô ³Ñ±â´Â ¹æ½ÄÀ¸·Î ¿¬°áÀ» ¸¸µé ¼ö ÀÖ´Ù. ¼ÒÄÏÀ̹ǷΠ´ç¿¬È÷ ÀüÀÌÁß Åë½ÅÀ» Áö¿øÇÏ°Ô µÈ´Ù.
#include <sys/types.h>  
#include <sys/socket.h>  
 
int socketpair(int d, int type, int protocol, int sv[2]);  
 
  • d : ¼ÒÄÏÀÇ µµ¸ÞÀÎ(¿µ¿ª)À» ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.
  • type °ú protocol ¸¦ ÀÌ¿ëÇØ¼­ ¼ÒÄÏÀÇ ºÎ°¡ÀûÀΠƯ¡À» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¸¸µé¾îÁø ¼ÒÄϽÖÀº sv¸¦ ÅëÇØ¼­ ³Ñ¾î¿Â´Ù. ¸¸µé¾îÁø ¼ÒÄϽÖÀº ±¸ºÐÇÒ ¼ö ¾ø´Ù.

pipe.c¿Í pipe_cl.cÀÇ socketpair ¹öÁ¯À¸·Î Àбâ/¾²±â°¡ ¸ðµÎ °¡´ÉÇÑ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡ ´ëÇÑ ¸ðµç ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇÑ´Ù.

#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));  
   }  
}  
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.