´ÙÀ½ À§·Î ÀÌÀü ¸ñÂ÷ ¸®´ª½º ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ °¡À̵å

6.2.2 C·Î ÆÄÀÌÇÁ ¸¸µé±â (Creating Pipes in C)

C ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î ÆÄÀÌÇÁ¶óÀÎÀ» ¸¸µå´Â °ÍÀº °£´ÜÇÑ ½© ¿¹Á¦º¸´Ù´Â ¸¹Àº °ÍÀ» Æ÷ÇÔÇÑ´Ù. C·Î °£´ÜÇÑ ÆÄÀÌÇÁ¸¦ ¸¸µé±â À§ÇØ pipe() ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÑ´Ù. ÀÌ°ÍÀº µÎ Á¤¼öÀÇ ¹è¿­ÀÎ ÇÑ°³ÀÇ ¾Æ±Ô¸ÕÆ®(argument)¸¦ °¡Áö¸ç, ¼º°øÇÏ¸é ¹è¿­Àº ÆÄÀÌÇÁ ¶óÀÎÀ» À§ÇØ »ç¿ëµÇ´Â »õ·Î¿î µÎ°³ÀÇ ÆÄÀÏ ½Äº°ÀÚ¸¦ °®´Â´Ù. ÆÄÀÌÇÁ¸¦ ¸¸µé°í ³­ ÈÄ, ÇÁ·Î¼¼½º´Â ÀüÅëÀûÀ¸·Î »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ³º´Â´Ù. (ÀÚ½ÄÀº ¿­·ÁÁø ÆÄÀÏ ½Äº°ÀÚ¸¦ »ó¼Ó¹Þ´Â´Ù´Â °ÍÀ» ±â¾ïÇ϶ó)


SYSTEM CALL: pipe();

PROTOTYPE: int pipe(int fd[2]);
  RETURNS: ¼º°ø½Ã 0
           -1 on error: errno = EMFILE (ÀÚÀ¯·Î¿î ½Äº°ÀÚ°¡ ¾ø´Ù)
                                EMFILE (½Ã½ºÅÛ ÆÄÀÏ Å×À̺íÀÌ ´Ù á´Ù)
                                EFAULT (fd ¹è¿­ÀÌ À¯È¿ÇÏÁö ¾Ê´Ù)
NOTES: fd[0]´Â Àб⸦ À§ÇØ ÁغñµÇ°í, fd[1]Àº ¾²±â¸¦ À§ÇØ ÁغñµÈ´Ù.

¹è¿­ÀÇ Ã¹¹ø° Á¤¼ö(element 0)´Â Àб⸦ À§ÇØ ÁغñµÇ°í ¿­·ÁÁö´Â ¹Ý¸é, µÎ¹ø° Á¤¼ö(element 1)´Â ¾²±â¸¦ À§ÇØ ÁغñµÇ°í ¿­·ÁÁø´Ù. ½Ã°¢ÀûÀ¸·Î ¸»Çϸé, fd1ÀÇ Ãâ·ÂÀº fd0¸¦ À§ÇÑ ÀÔ·ÂÀÌ µÈ´Ù. ÆÄÀÌÇÁ¸¦ ÅëÇØ À̵¿ÇÏ´Â ¸ðµç ÀÚ·á´Â Ä¿³ÎÀ» ÅëÇØ À̵¿ÇÔÀ» ´Ù½Ã ¸»ÇصдÙ.

	#include <stdio.h>
	#include <unistd.h>
	#include <sys/types.h>

	main()
	{

		int fd[2];

		pipe(fd);
		.
		.
	}

C¿¡¼­ ¹è¿­ÀÇ À̸§Àº ù¹ø° ¸â¹öÀÇ Æ÷ÀÎÅÍÀÓÀ» ±â¾ïÇ϶ó. À§¿¡¼­, fd´Â &fd[0]¿Í °°´Ù. ÆÄÀÌÇÁ ¶óÀÎÀ» ¸¸µé°í ³­ ÈÄ, »õ·Î¿î ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼º(fork)ÇÑ´Ù.:

	#include <stdio.h>
	#include <unistd.h>
	#include <sys/types.h>

	main()
	{
		int fd[2];

		pipe(fd);

		if((childpid = fork()) == -1)
		{
			perror("fork");
			exit(1);
		}
		.
		.
	}

ºÎ¸ð°¡ ÀÚ½ÄÀ¸·Î ºÎÅÍ ÀڷḦ Á¶È¸Çϱ⸦ ¿øÇÑ´Ù¸é, fd1¸¦ ´Ý¾Æ¾ß ÇÏ°í ÀÚ½ÄÀº fd0¸¦ ´Ý¾Æ¾ß ÇÑ´Ù. ºÎ¸ð°¡ ÀڽĿ¡°Ô ÀڷḦ º¸³»°íÀÚ ÇÑ´Ù¸é, fd0¸¦ ´Ý¾Æ¾ß ÇÏ°í ÀÚ½ÄÀº fd1À» ´Ý¾Æ¾ß ÇÑ´Ù. ºÎ¸ð¿Í Àڽİ£¿¡ ½Äº°ÀÚ¸¦ °øÀ¯ÇÏ°í ÀÖÀ¸¹Ç·Î, °ü°èÇÏ°í ÀÖÁö ¾Ê´Â ÆÄÀÌÇÁÀÇ ³¡Àº Ç×»ó ´ÝÇôÁ®¾ß¸¸ ÇÑ´Ù. ±â¼úÀûÀÎ ÁÖÀÇ»çÇ×Àº ºÒÇÊ¿äÇÑ ÆÄÀÌÇÁÀÇ ³¡À» ¸í¹éÇÏ°Ô ´ÝÁö ¾ÊÀ¸¸é EOF´Â ¿µ¿øÈ÷ µ¹¾Æ¿ÀÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù.

	#include <stdio.h>
	#include <unistd.h>
	#include <sys/types.h>

	main()
	{
		int	fd[2];
		pid_t	childpid;

		pipe(fd);

		if((childpid = fork()) == -1)
		{
			perror("fork");
			exit(1);
		}

		if(childpid == 0)
		{
			/*ÀÚ½Ä ÇÁ·Î¼¼½º´Â ÆÄÀÌÇÁÀÇ ÀÔ·Â ÂÊÀ» ´Ý´Â´Ù*/
			close(fd[0]);
		}
		else
		{
			/*ºÎ¸ð ÇÁ·Î¼¼½º´Â ÆÄÀÌÇÁÀÇ Ãâ·Â ÂÊÀ» ´Ý´Â´Ù*/
			close(fd[1]);
		}
		.
		.
	}

¾Õ¿¡¼­ ¸»Çß´ø °Íó·³, ÆÄÀÌÇÁ¶óÀÎÀ» ¸¸µç ÈÄ¿¡ ÆÄÀÏ ½Äº°ÀÚ´Â ÀÏ¹Ý ÆÄÀÏÀÇ ½Äº°ÀÚó·³ Ãë±ÞµÈ´Ù.

/*****************************************************************************
 ¸®´ª½º ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ °¡À̵å - 6Àå ¿¡¼­ ¹ßÃé
 (C)opyright 1994-1995, Scott Burkett
 ***************************************************************************** 
 MODULE: pipe.c
 *****************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
        int     fd[2], nbytes;
        pid_t   childpid;
        char    string[] = "Hello, world!\n";
        char    readbuffer[80];

        pipe(fd);
        
        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
		/*ÀÚ½Ä ÇÁ·Î¼¼½º´Â ÆÄÀÌÇÁÀÇ ÀÔ·Â ÂÊÀ» ´Ý´Â´Ù*/
                close(fd[0]);

		/*ÆÄÀÌÇÁÀÇ Ãâ·Â ÂÊÀ¸·Î "string"À» º¸³½´Ù*/
                write(fd[1], string, strlen(string));
                exit(0);
        }
        else
        {
		/*ºÎ¸ð ÇÁ·Î¼¼½º´Â ÆÄÀÌÇÁÀÇ Ãâ·Â ÂÊÀ» ´Ý´Â´Ù*/
                close(fd[1]);

		/*ÆÄÀÌÇÁ·Î ºÎÅÍ ¹®ÀÚ¿­À» Àд´Ù*/
                nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
        }
        
        return(0);
}

Á¾Á¾ ÀÚ½ÄÀÇ ½Äº°Àڴ ǥÁØ ÀÔ·Â ¶Ç´Â Ãâ·Â°ú ÁßøµÈ´Ù. ÀÚ½ÄÀº Ç¥ÁØ streamÀ» »ó¼ÓÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥À» exec() ÇÒ ¼ö ÀÖ´Ù. dup() ½Ã½ºÅÛ È£ÃâÀ» »ìÆ캸ÀÚ.:


 SYSTEM CALL: dup();                                                           

  PROTOTYPE: int dup( int oldfd );                                              
    RETURNS: ¼º°ø½Ã »õ·Î¿î ½Äº°ÀÚ 
             -1 on error: errno = EBADF (oldfd°¡ À¯È¿ÇÑ ½Äº°ÀÚ°¡ ¾Æ´Ï´Ù)       
                                  EBADF (newfd°¡ ¹üÀ§¸¦ ¹þ¾î³µ´Ù)                 
                                  EMFILE (ÇÁ·Î¼¼½º¿¡ ´ëÇØ ½Äº°ÀÚ°¡ ³Ê¹« ¸¹´Ù) 

  NOTES: °ú°ÅÀÇ ½Äº°ÀÚ´Â ´ÝÇôÁöÁö ¾Ê´Â´Ù. µÎ°³°¡ »óÈ£ ±³È¯µÇ¾îÁú ¼ö ÀÖ´Ù.


°ú°ÅÀÇ ½Äº°ÀÚ¿Í »õ·Î ¸¸µé¾îÁø ½Äº°ÀÚ°¡ »óÈ£ ±³È¯µÇ¾îÁú ¼ö ÀÖ´õ¶óµµ, ÀüÅëÀûÀ¸·Î Ç¥ÁØ streamÀÇ ÇÑÂÊÀ» ´Ý´Â´Ù. dup() ½Ã½ºÅÛ È£ÃâÀº »õ·Î¿î ½Äº°ÀÚ¿¡°Ô ¾ÆÁ÷ »ç¿ëµÇÁö ¾ÊÀº °¡Àå ÀÛÀº ¹øÈ£¸¦ ºÎ¿©ÇÑ´Ù.

ÁÖÀÇÇؼ­ º¸ÀÚ:

        .
        .
        childpid = fork();
        
        if(childpid == 0)
        {
		/*ÀÚ½ÄÀÇ Ç¥ÁØ ÀÔ·ÂÀ» ´Ý´Â´Ù*/
                close(0);
                
		/*ÆÄÀÌÇÁÀÇ ÀÔ·Â ÂÊÀ» Ç¥ÁØÀÔ·ÂÀ¸·Î ÇÑ´Ù*/
                dup(fd[0]);
                execlp("sort", "sort", NULL);
                .
        }

ÆÄÀÏ ½Äº°ÀÚ 0ÀÌ ´ÝÈù ÈÄ, dup()¸¦ È£ÃâÇÏ¿© ÆÄÀÌÇÁÀÇ ÀÔ·Â ½Äº°ÀÚ(fd0)¸¦ Ç¥ÁØ ÀÔ·ÂÀ¸·Î º¹»çÇÑ´Ù. Á¤·Ä(sort) ÇÁ·Î±×·¥°ú ÀÚ½ÄÀÇ ÅؽºÆ® ¼¼±×¸ÕÆ®(text segment)¸¦ Áßø½ÃÅ°±â À§ÇØ execlp()ÀÇ È£ÃâÀ» »ç¿ëÇÑ´Ù. »õ·Ó°Ô execµÈ ÇÁ·Î±×·¥µéÀº ±×µéÀÇ ºÎ¸ð·Î ºÎÅÍ Ç¥ÁØ streamÀ» »ó¼Ó¹ÞÀ¸¹Ç·Î, ½ÇÁ¦·Î ÆÄÀÌÇÁÀÇ ÀÔ·Â ³¡À» Ç¥ÁØ ÀÔ·Âó·³ »ó¼Ó¹Þ´Â´Ù. ¿ø·¡ÀÇ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ·Î º¸³»·Á´Â °ÍÀº sort·Î °¡°Ô µÈ´Ù.

dup2()¶ó´Â ¶Ç ´Ù¸¥ ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ Æ¯º°ÇÑ È£ÃâÀº À¯´Ð½º ¹öÀü 7·Î ºÎÅÍ ½ÃÀ۵Ǿú°í, BSD ¹öÀü¿¡¼­µµ ¼öÇàµÇ¸ç POSIX Ç¥ÁØ¿¡¼­µµ ÇÊ¿äÇÏ´Ù.


  SYSTEM CALL: dup2();                                                          

  PROTOTYPE: int dup2( int oldfd, int newfd );                                  
    RETURNS: ¼º°ø½Ã »õ ½Äº°ÀÚ
             -1 on error: errno = EBADF (oldfd°¡ À¯È¿ÇÑ ½Äº°ÀÚ°¡ ¾Æ´Ï´Ù)       
                                  EBADF (newfd°¡ ¹üÀ§¸¦ ¹þ¾î³µ´Ù)                 
                                  EMFILE (ÇÁ·Î¼¼½º¿¡ ´ëÇØ ½Äº°ÀÚ°¡ ³Ê¹« ¸¹´Ù) 

  NOTES: °ú°ÅÀÇ ½Äº°ÀÚ´Â dup2()¿¡ ÀÇÇØ ´ÝÈù´Ù!

ÀÌ·± Ưº°ÇÑ È£ÃâÀ» »ç¿ëÇÏ¿© ÇÑ°³ÀÇ ½Ã½ºÅÛ È£Ãâ·Î Æ÷ÀåµÇ¾î ÀÖ´Â close ÀÛ¾÷°ú ½ÇÁ¦ ½Äº°ÀÚ º¹»ç ÀÛ¾÷À» ÇÑ´Ù. °Ô´Ù°¡, ÀÛ¾÷ÀÇ ¿øÀÚÈ­(atomic)°¡ Çã¿ëµÇ´Âµ¥ ÀÌ´Â ±âº»ÀûÀ¸·Î ½ÅÈ£ÀÇ µµÂø¿¡ ÀÇÇØ ÀÛ¾÷ÀÌ ÁߴܵÇÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù. Àüü µ¿ÀÛÀº ½ÅÈ£ÀÇ ¹ß¼ÛÀ» À§ÇØ Ä¿³Î¿¡°Ô ÅëÁ¦±ÇÀ» µ¹·ÁÁÖ±â Àü¿¡ ÀϾ´Ù. ÇÁ·Î±×·¡¸Ó´Â È£ÃâÇϱâ Àü¿¡ ¿ø·¡ÀÇ dup() ½Ã½ºÅÛ È£ÃâÀ» °¡Áö°í close() ÀÛ¾÷À» ¼öÇàÇؾ߸¸ ÇÑ´Ù. ±×°ÍÀº ±×µé »çÀÌ¿¡¼­ °æ°úµÇ´Â ÀÛÀº ½Ã°£ÀÇ ¾ç¿¡ ´ëÇÑ ´Ù¼ÒÀÇ ¾àÁ¡À» °¡Áø µÎ°³ÀÇ ½Ã½ºÅÛ È£Ãâ·Î ³¡³­´Ù. ±× ªÀº »çÀÌ¿¡ ½ÅÈ£°¡ µµÂøÇÑ´Ù¸é, ½Ãº°ÀÚÀÇ º¹»ç´Â ½ÇÆÐÇÑ´Ù. ¹°·Ð, dup2()´Â ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇß´Ù.

»ìÆ캸ÀÚ:

        .
        .
        childpid = fork();
        
        if(childpid == 0)
        {
                /* Close stdin, duplicate the input side of pipe to stdin */
                dup2(0, fd[0]);
                execlp("sort", "sort", NULL);
                .
                .
        }


ÀÌÀü:6.2.1 ±âº» °³³ä ´ÙÀ½:6.2.3 ÆÄÀÌÇÁ ½¬¿î ¹æ¹ý!

Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved

Email To:Webmaster , Another address
LAST UPDATE Nov 14,1997
Created Nov 14,1997