socketpair
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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