¸®´ª½º ÀÍ¸í ÆÄÀÌÇÁ ÀÀ¿ë
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

PIPE ÀÀ¿ë

PIPE ÀÀ¿ë

À± »ó¹è

dreamyun@yahoo.co.kr


차례
1절. ¼Ò°³
2절. ¸¸µé°íÀÚ Çϴ°Í
2.1절. pipe(2) ÇÔ¼ö¿¡ ´ëÇØ¼­
2.2절. ÀÛµ¿ process
2.3절. ¿¹Á¦ ÄÚµå

1절. ¼Ò°³

¿ì¸®´Â ÀÌ¹Ì PIPE ¸¦ ÅëÇÑ IPC ÀÇ ±¸Çö¿¡ ´ëÇØ¼­ ¸î¹ø¿¡ °ÉÃÄ ´Ù·ç¾ú¾ú´Ù. ±×·±µ¥ ÇÊÀÚ°¡ ½Ç¼ö·Î º¸¸ðÀڽİ£ÀÇ Åë½ÅÀ» À§ÇÑ pipe ÀÇ »ç¿ë¿¡ ´ëÇÑ ³»¿ëÀº »©¸Ô¾ú¾ú´Ù.

À̹ø¿¡´Â ÀÌ pipe ÀÇ »ç¿ë¹ý¿¡ ´ëÇÑ ÀÀ¿ëÀ» ¿¹¸¦µé¾î ¼³¸íÇÒ »ý°¢ÀÌ´Ù.


2절. ¸¸µé°íÀÚ Çϴ°Í

¿ì¸®´Â ¸î°³ÀÇ ½ÇÇàÇÁ·Î±×·¥À¸·Î ÀÌ·ç¾îÁø ½Ã½ºÅÛÀ» ¼³Ä¡ÇÏ ÀÏÁ¾ÀÇ ÀÚµ¿½ÇÇà ÇÁ·Î±×·¥À» ¸¸µé°ÍÀÌ´Ù. ÀÌ ½Ã½ºÅÛÀº 3°³ÀÇ ÇÁ·Î±×·¥À¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥µéÀº ÀÏÁ¤ÇÑ ¼ø¼­´ë·Î ½ÇÇàÀÌ µÇ¾î¾ß Çϸç, ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±âÀü¿¡ ¹Ù·Î¾ÕÀÇ ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ½ÇÇàµÇ¾ú´ÂÁö È®ÀÎÈÄ Á¦´ë·Î ½ÇÇàµÇ¾ú´Ù¸é ½ÇÇàµÇ¾î¾ß ÇÑ´Ù.

À̰ÍÀ» ±¸ÇöÇϱâ À§Çؼ­ ¿ì¸®´Â main ½ÇÇàÆÄÀÏÀ» Çϳª ¸¸µçÈÄ, main ½ÇÇàÆÄÀÏ¿¡¼­ fork&exec ¹æ½ÄÀ» ÀÌ¿ëÇØ¼­ ¼ø¼­´ë·Î ³ª¸ÓÁö 3°³ÀÇ sub ÇÁ·Î±×·¥µéÀ» ½ÇÇàÇÏ°Ô µÉ°ÍÀÌ´Ù.

sub ÇÁ·Î±×·¥ÀÇ ½ÇÇà¼ø¼­¿Í ½ÇÇàÇÒ ÆÄÀÏÀ̸§À» ÁöÁ¤ÇØÁÖ±â À§ÇÑ ¼³Á¤ÆÄÀÏÀ» °¡Áö°Ô µÇ¸ç, main ÇÁ·Î±×·¥Àº ¼³Á¤ÆÄÀÏÀ» Àоîµé¿©¼­ sub ÇÁ·Î±×·¥µéÀ» ½ÇÇà½ÃŰ°Ô µÉ°ÍÀÌ´Ù.

±×·±µ¥ À̵é ÇÁ·Î±×·¥Àº ¾ÕÀÇ ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ½ÇÇàµÇ¾ú´ÂÁö È®ÀÎÈÄ Â÷·Ê´ë·Î ½ÇÇà½ÃÄÑÁÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. ±×·¯±â À§Çؼ­ main ÇÁ·Î±×·¥Àº ÇϳªÀÇ sub ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲÈÄ ½ÇÇà½ÃŲ sub ÇÁ·Î±×·¥°ú pipe ¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÏ°Ô µÉ°ÍÀÌ´Ù. sub ÇÁ·Î±×·¥Àº ÀÚ½ÅÀÇ pid ¸¦ main ÇÁ·Î±×·¥¿¡ ³Ñ°ÜÁÖ°Ô µÇ°í, main Àº ÀÌ pid ¸¦ ³Ñ°Ü ¹ÞÀ¸¸é sub ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ½ÇÇàµÇ¾ú´Ù°í ÆÇ´ÜÇÏ°í ´ÙÀ½ sub ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°Ô µÈ´Ù.


2.1절. pipe(2) ÇÔ¼ö¿¡ ´ëÇØ¼­

pipe ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇ¸é, ÀбâÀü¿ë°ú ¾²±âÀü¿ë µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÒ¼ö ÀÖ´Ù.

	
#include <unistd.h>
int pipe(int filedes[2]);
			
¾Æ±Ô¸ÕÆ®¸¦ º¸¸é intÇü ¹è¿­ÀÓÀ» ¾Ë¼ö ÀÖ´Ù. ÀÌ´Â pipe È£Ãâ·Î ¸¸µé¾î Áö´Â ÀбâÀü¿ë°ú ¾²±âÀü¿ëÀÇ ÆÄÀÌÇÁ ¿¬°áÀÚ¸¦ ³Ñ°Ü ¹Þ±â À§ÇÔÀÌ´Ù.

PIPE ÀÇ Àü¹ÝÀûÀΠƯ¼ºÀº ÀÌ »çÀÌÆ®ÀÇ ´Ù¸¥ ¹®¼­µéÀ» Âü°íÇϱ⠹ٶõ´Ù.


2.2절. ÀÛµ¿ process

ÀÌ ÇÁ·Î±×·¥Àº ¾Æ¸¶ ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÀÛµ¿ÇÒ°ÍÀÌ´Ù.

¸ÞÀÎ ÇÁ·Î±×·¥ ½ÃÀÛ
int main()
{
    ¼³Á¤ÆÄÀÏÀ» ÀоîµéÀδÙ. 
    ÆÄÀÌÇÁ¸¦ »ý¼ºÇÑ´Ù. 
    while(¼³Á¤ÆÄÀÏÀÇ Å©±â¸¸Å­)
    {
       fork ½ÃŲ´Ù
       fork ½ÃŲ ÇÁ·Î¼¼½º°¡ ÀÚ½Ä ÇÁ·Î¼¼½º¶ó¸é
       {
           dup2 ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ 1¹ø ÆÄÀÌÇÁ(¾²±âÀü¿ë)À» 1(Ç¥ÁØÃâ·Â) À¸·Î º¹»ç
		   ÇÑ´Ù. 
           ¼³Á¤ÆÄÀÏ¿¡¼­ ÀоîµéÀÎ sub ÇÁ·Î±×·¥À» 
           execl ÇÔ¼ö¸¦ ÅëÇØ¼­ ½ÇÇà½ÃŲ´Ù.  
       }
       0¹ø ÆÄÀÌÇÁ(ÀбâÀü¿ë)¿¡¼­ sub ÇÁ·Î±×·¥À¸·Î ºÎÅÍ ³Ñ¾î¿À´Â µ¥ÀÌŸ¸¦ 
	   Àд´Ù. 
    }
}
			

exec ÇÔ¼ö¸¦ ½ÇÇà½Ãų°æ¿ì ¿­¸°ÆÄÀÏ Áö½ÃÀÚ°¡ »ó¼ÓµÈ´Ù´Â Á¡À» ¾Ë°í ÀÖÀ»°ÍÀÌ´Ù. dup2 ¸¦ ÀÌ¿ëÇØ¼­ ±âÁ¸¿¡ ¸¸µé¾îÁø ¾²±âÀü¿ë ÆÄÀÌÇÁ ¹øÈ£¸¦ Ç¥ÁØÃâ·Â(1) À¸·Î º¹»çÇÏ°í ³ª¼­ execl ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é, ÀÌ ÇÁ·Î±×·¥Àº Ç¥ÁØÃâ·ÂÀ» ÅëÇØ¼­ ºÎ¸ðÀÇ ÆÄÀÌÇÁ ¿Í Åë½ÅÇÒ¼ö ÀÖ°Ô µÈ´Ù.


2.3절. ¿¹Á¦ ÄÚµå

¿¹Á¦ ÄÚµå´Â 2°³ÀÇ ¼Ò½º·Î ÀÌ·ç¾îÁú °ÍÀÌ´Ù. Çϳª´Â main ÇÁ·Î±×·¥À¸·Î ÇÁ·Î±×·¥ÀÇ À̸§Àº pm.cc À̰í, ´Ù¸¥ Çϳª´Â pm ÇÁ·Î±×·¥¿¡¼­ frok&exec ·Î ½ÇÇà½Ãų sub ÇÁ·Î±×·¥À¸·Î À̸§Àº proc.c ÀÌ´Ù.

¿¹Á¦ : proc.c

	
int main()
{
    char buf[20];
    memset (buf, 0x00, 20);
    sprintf(buf, "%d", getpid()); 
    write(1, buf, 20);
    while(1)
    {
        sleep(1);
    }
}

			

ÇÁ·Î±×·¥ÀÌ ÇÏ´ÂÀÏÀº °£´ÜÇÏ´Ù. ÀÚ½ÅÀÇ pid ¹øÈ£¸¦ write ¸¦ ÀÌ¿ëÇØ¼­ Ç¥ÁØÃâ·ÂÀ¸·Î º¸³»´Â °ÍÀÌ´Ù. ÀÌ Ç¥ÁØÃâ·ÂÀº pm ¿¡¼­ »ý¼º½ÃŲ pipe ¿Í ¿¬°áµÇ¾î ÀÖÀ½À¸·Î pid ¹øÈ£´Â pm ÇÁ·Î±×·¥À¸·Î Àü´ÞµÉ °ÍÀÌ´Ù.

ÀÌ ÆÄÀÏÀ» ÄÄÆÄÀÏ ÇÑ´ÙÀ½¿¡ proc1, proc2, proc3 ¶ó´Â À̸§À¸·Î º¹»çÇØ¼­ Àû´çÇÑ µð·ºÅ丮¿¡ ¿Å°Ü ³õµµ·Ï ÇÏÀÚ. ÇÊÀÚÀÇ °æ¿ì /usr/yundream/bin ¿¡ ¿Å°Ü ³õ¾Ò´Ù.

¿¹Á¦ : main.c

#include <vector>
#include <stdio.h>
#include <string>
#include <unistd.h>

int main(int argc, char **argv)
{
    FILE *fp;    
    char buf[80];
    char info[20];
    int my_pid;
    int pid;
    int mypipe[2];
    vector<string> proc_info;

    fp = fopen("config.cfg", "r");

    while(fgets(buf, 80, fp) != NULL)
    {
        buf[strlen(buf) - 1] = 0x00; 
        proc_info.push_back(buf);
    }
    fclose(fp);

    my_pid = getpid();
    pipe(mypipe);
    for (int i = 0; i < proc_info.size(); i++)
    {
        if (getpid() != my_pid)
            exit(0);

        pid = fork();
        if (pid == 0)
        {
            dup2(mypipe[1], 1);
            close(mypipe[0]);
            close(mypipe[1]);
            execl(proc_info[i].c_str(), proc_info[i].c_str(), NULL);
        }
        read(mypipe[0], info, 20);    
        cout << "exec " << info << endl; 
    }
    pause();
}
			

pm.cc ´Â main ÇÁ·Î±×·¥ÀÌ´Ù. ¼³Á¤ÆÄÀÏ config.cfg ·Î ºÎÅÍ ½ÇÇà½ÃÄÑ¾ßµÉ ÆÄÀÏÀ̸§À» Àоîµé¾î¿Í¼­ vector ·Î ¸ñ·ÏÀ» ¸¸µç´ÙÀ½¿¡ fork&exec ·Î ¹Ì¸® ¸¸µé¾î ³õÀº proc1, proc2, proc3 ¸¦ ½ÇÇà ½ÃŰ´Ù. config.cfg ÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÉ°ÍÀÌ´Ù.

/usr/yundream/bin/proc1
/usr/yundream/bin/proc2
/usr/yundream/bin/proc3
			

À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ¸é ¾Æ·¡¿Í °°Àº °á°ú¸¦ º¸¿©ÁÙ°ÍÀÌ´Ù.

[root@localhost test]# ./pm
exec 3642
exec 3643
exec 3644
			
½ÇÇàÀ» Çß´Ù¸é ½ÇÁ¦·Î sub ÇÁ·Î±×·¥µéÀÇ Ç¥ÁØÃâ·ÂÀÌ ¾î¶»°Ô 󸮵ǰí ÀÖ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. /proc/3642/fd ·Î À̵¿Çؼ­ ls °ªÀ» º¸µµ·Ï ÇÏÀÚ.
[root@localhost fd]# ls -al
ÇÕ°è 0
dr-x------    2 root     root            0  7¿ù 28 14:09 .
dr-xr-xr-x    3 root     root            0  7¿ù 28 14:08 ..
lrwx------    1 root     root           64  7¿ù 28 14:09 0 -> /dev/pts/5
l-wx------    1 root     root           64  7¿ù 28 14:09 1 -> pipe:[28721]
lrwx------    1 root     root           64  7¿ù 28 14:09 2 -> /dev/pts/5
			
À§ÀÇ °á°ú¸¦ º¸¸é Ç¥ÁØÃâ·Â 1 ÀÌ /dev/pts/5 ·Î ¿¬°áµÇ¾î ÀÖÁö ¾Ê°í, pipe ·Î ¿¬°áµÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÌ ÆÄÀÌ´Â ¾²±â Àü¿ëÀÓÀ» ¾Ë¼ö ÀÖ´Ù.

ÀÌÁ¦ pm ÀÇ ÆÄÀÏÁö½ÃÀÚ ±¸Á¶¸¦ ¾Ë¾Æº¸°Ú´Ù. pm ÀÇ pid ¹øÈ£¸¦ ¾Ë¾Æ³»°í /proc/pmpid/fd ·Î À̵¿Çؼ­ ls °ªÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

[root@localhost fd]# ls -al
ÇÕ°è 0
dr-x------    2 root     root            0  7¿ù 28 14:11 .
dr-xr-xr-x    3 root     root            0  7¿ù 28 14:11 ..
lrwx------    1 root     root           64  7¿ù 28 14:11 0 -> /dev/pts/5
lrwx------    1 root     root           64  7¿ù 28 14:11 1 -> /dev/pts/5
lrwx------    1 root     root           64  7¿ù 28 14:11 2 -> /dev/pts/5
lr-x------    1 root     root           64  7¿ù 28 14:11 3 -> pipe:[28721]
l-wx------    1 root     root           64  7¿ù 28 14:11 4 -> pipe:[28721]
			
2°³ÀÇ ÆÄÀÌÇÁ°¡ »ý¼ºµÇ¾úÀ½À» ¾Ë¼ö ÀÖ´Ù. Çϳª´Â ÀбâÀü¿ë ÆÄÀÌÇÁÀ̰í, ¶Ç´Ù¸¥ Çϳª´Â ¾²±âÀü¿ë ÆÄÀÌÇÁÀÌ´Ù. ±×¸®°í ÆÄÀÌÇÁ ¹øÈ£¸¦ º¸¸é 28721 ·Î °¢ sub ÇÁ·Î±×·¥µéÀÇ ÆÄÀÌÇÁ¹øÈ£¿Í ÀÏÄ¡ÇÔÀ» ¾Ë¼ö ÀÖ´Ù. À̸¦ ÅëÇØ¼­ °¢ sub ÇÁ·Î±×·¥µéÀÇ Ç¥ÁØÃâ·Â 1 Àº pm ÀÇ ÀбâÀü¿ë ÆÄÀÌÇÁÀÇ ¿¬°á¹øÈ£ÀÎ 3 ¹ø°ú ¿¬°áµÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.