¸®´ª½º ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ °¡À̵å
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: °ú°ÅÀÇ ½Äº°ÀÚ´Â ´ÝÇôÁöÁö ¾Ê´Â´Ù. µÎ°³°¡ »óÈ£ ±³È¯µÇ¾îÁú ¼ö ÀÖ´Ù.
ÁÖÀÇÇØ¼ º¸ÀÚ:
.
.
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()¿¡ ÀÇÇØ ´ÝÈù´Ù!
»ìÆìº¸ÀÚ:
.
.
childpid = fork();
if(childpid == 0)
{
/* Close stdin, duplicate the input side of pipe to stdin */
dup2(0, fd[0]);
execlp("sort", "sort", NULL);
.
.
}
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