10. ÆÄÀÌÇÁ ¿Í FIFO
ÆÄÀÌÇÁ´Â ÇÁ·Î¼¼½º»çÀÌÀÇ Åë½ÅÀ» À§ÇÑ ¸ÞÄ«´ÏÁòÀÌ´Ù; ÇÑ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÆÄÀÌÇÁ¿¡ ¾²¿©Áø °ÍÀº ´Ù ¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ÀÐÇôÁú ¼ö ÀÖ´Ù. µ¥ÀÌÅÍ´Â ¼±ÀÔ¼±Ãâ(FIFO) ¼ø¼·Î ´Ù·ïÁø´Ù. ÆÄÀÌÇÁ´Â À̸§À» °¡Áö°í ÀÖÁö ¾Ê´Ù;
±×°ÍÀÌ ÇÑ ¹ø »ç¿ëÇϱâ À§ÇØ ¸¸µé¾îÁö°í ¾ç³¡Àº ±× ÆÄÀÌÇÁ¸¦ ¸¸µç ´ÜÀÏ ÇÁ·Î¼¼½º·ÎºÎÅÍ »ó¼ÓµÇ¾îÁ® ¾ß¸¸ ÇÑ´Ù. Ưº°ÇÑ ÆÄÀÏÀÎ FIFO´Â ÆÄÀÌÇÁ¿Í À¯»çÇÏÁö¸¸, ÆÄÀÌÇÁ°¡ À̸§ÀÌ ¾ø°í ÀÓ½ÃÀûÀÎ ¿¬°áÀÎ°Í ¿¡ ºñÇØ, FIFO´Â À̸§À» °®°í ÀÖ´Ù. ÇÁ·Î¼¼½º´Â ±×°ÍÀ» ÅëÇØ Åë½ÅÀÇ ¸ñÀûÀ¸·Î, À̸§À» °¡Áø FIFO ¸¦ °³¹æÇÑ´Ù. ÆÄÀÌÇÁ³ª FIFO´Â µ¿½Ã¿¡ ¾ç³¡À» °³¹æÇؾßÇÑ´Ù. ¸¸ÀÏ ´ç½ÅÀÌ ÆÄÀÌÇÁ³ª FIFO¿¡ ¾²±âÀ§ ÇÑ ÇÁ·Î¼¼½º¸¦ °¡ÁöÁö¾ÊÀº ÆÄÀÌÇÁ³ª FIFO·ÎºÎÅÍ ÀÐÀ»·Á¸é, Àбâ´Â ÆÄÀÏÀÇ ³¡À» ¸®ÅÏÇÑ´Ù. Àбâ ÇÁ ·Î¼¼½º¸¦ °¡ÁöÁö¾ÊÀº ÆÄÀÌÇÁ³ª FIFO¿¡ ¾²±â´Â ¿¡·¯°¡ ¹ß»ýµÈ °ÍÀ¸·Î Ãë±ÞµÈ´Ù; ±×°ÍÀº SIGPIPE ½ÅÈ£·Î ÀϹÝȵǰí, ¸¸ÀÏ ±× ½ÅÈ£°¡ ºí·ÏµÇ¾îÁ³´Ù¸é ¿¡·¯ÄÚµå EPIPE·Î ¿¡·¯ÀÓÀ»³ªÅ¸³½´Ù.
Ưº°ÇÑ ÆÄÀÏÀÎ ÆÄÀÌÇÁ³ª FIFOµµ ÆÄÀÏ À§Ä¡½Ã۱â(positioning)À» Çã¿ëÇÑ´Ù. Àбâ¿Í ¾²±â µ¿ÀÛÀº ¼ø Â÷ÀûÀ¸·Î ÀϾÙ; ÆÄÀÏÀÇ ¾Õ¿¡¼ºÎÅÍ ÀÐ¾î¼ ±× ³¡¿¡ Ãâ·ÂÇÑ´Ù.
10.1 ÆÄÀÌÇÁ ¸¸µé±â.
ÆÄÀÌÇÁ¸¦ ¸¸µå´Â ÇÔ¼ö·Î´Â pipeÇÔ¼ö°¡ ÀÖ´Ù. À̰ÍÀº ÆÄÀÌÇÁÀÇ ¾ç³¡À» Àбâ¿Í ¾²±â·Î ¸¸µç´Ù. ÀÌ°Í Àº ´ÜÀÏÇÑ ÇÁ·Î¼¼½º¿¡ »ç¿ëÇϱ⿡ À¯¿ëÇÏÁö ¾Ê°í, Ưº°È÷ ÇÑ ÇÁ·Î¼¼½º°¡ Çϳª ȤÀº ´õ ¸¹Àº ÀÚ½Ä ÇÁ ·Î¼¼½ºµéÀ»( 23.4Àý [Creating a Process] 326 ÆäÀÌÁö ÂüÁ¶) »ý¼ºÇϱâ Àü¿¡ ´ÜÁö ÆÄÀÌÇÁ¸¦ ¸¸µç´Ù. ±×¸®°í ³ª¼ ±× ÆÄÀÌÇÁ´Â ºÎ¸ð ȤÀº ÀÚ½Ä ÇÁ·Î¼¼½ºµé, ¶Ç´Â µÎ °³ÀÇ ÇüÁ¦ ÇÁ·Î¼¼½º »çÀÌÀÇ Åë½ÅÀ» À§Çؼ »ç¿ëµÇ¾îÁø´Ù.
ÆÄÀÌÇÁ ÇÔ¼ö´Â Çì´õÆÄÀÏ 'unistd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : int pipe (int filedes[2])
pipe ÇÔ¼ö´Â ÆÄÀÌÇÁ¸¦ ¸¸µé°í ÆÄÀÌÇÁÀÇ ³¡¿¡¼(°¢°¢) Àбâ¿Í ¾²±â¸¦ À§ÇÑ ÆÄÀÏ ±â¼úÀÚÀÎ filedes[0] °ú filedes[1]À» ÀúÀåÇÑ´Ù. ÆÄÀϱâ¼úÀÚ 0´Â Ç¥ÁØ ÀÔ·ÂÀ̰í, ÆÄÀÏ ±â¼úÀÚ 1Àº Ç¥ÁØ Ãâ·ÂÀÌ´Ù. ¸¸ÀÏ ¼º °øÇϸé, pipe´Â 0À» ¸®ÅÏÇϰí, ½ÇÆÐÇϸé -1À» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡ ·¯ »óȲÀÌ´Ù.
EMFILE
±× ÇÁ·Î¼¼½º°¡ °³¹æµÈ ³Ê¹« ¸¹Àº ÆÄÀÏÀ» °®°í ÀÖ´Ù.
ENFILE
ÀüÁ¦ ½Ã½ºÅ۾ȿ¡ °³¹æµÈ ÆÄÀÏÀÌ ³Ê¹« ¸¹´Ù. ENFILE¿¡ ´ëÇÑ »ó¼¼ÇÑ °ÍÀº 2.2Àý [Error Codes]12Æä ÀÌÁö¸¦ ÂüÁ¶Ç϶ó. À̰÷ÀÇ ¿¹´Â ÆÄÀÌÇÁ¸¦ ¸¸µå´Â °£´ÜÇÑ ¿¹ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸ µé±â À§Çؼ forkÇÔ¼ö( 23.4Àý [Creating a Process], 326ÆäÀÌÁö ÂüÁ¶)¸¦ »ç¿ëÇÑ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â ÆÄÀÌÇÁ¿¡ µ¥ÀÌÅ͸¦ ¾²°í ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ ÀÇÇØ ±× µ¥ÀÌÅͰ¡ ÀÐÇôÁø´Ù.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/* ÆÄÀÌÇÁ·ÎºÎÅÍ ¹®ÀÚµéÀ» ÀÐ°í ±×µéÀº Ç¥ÁØ Ãâ·Â¿¡ Ãâ·ÂÇ϶ó
*/
void
read_from_pipe (int file)
{
FILE *stream;
int c;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF)
putchar (c);
fclose (stream);
}
/* ÆÄÀÌÇÁ¿¡ ¾î¶² ÅØ½ºÆ®¸¦ ½á¶ó */
void
write_to_pipe (int file)
{
FILE *stream;
stream = fdopen (file, "w");
fprintf (stream, "hello, world!\n");
fprintf (stream, "goodbye, world!\n");
fclose (stream);
}
int
main (void)
{
pid_t pid;
int mypipe[2];
/* ÆÄÀÌÇÁ¸¦ ¸¸µé¾î¶ó */
if (pipe (mypipe))
{
fprintf (stderr, "Pipe failed.\n");
return EXIT_FAILURE;
}
/* ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î¶ó */
pid = fork ();
if (pid == (pid_t) 0)
{
/* À̰ÍÀº ÀÚ½Ä ÇÁ·Î¼¼½ºÀÌ´Ù. */
read_from_pipe (mypipe[0]);
return EXIT_SUCCESS;
}
else if (pid < (pid_t) 0)
{
/* fork°¡ ½ÇÆÐÇß´Ù. */
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
}
else
{
/* À̰ÍÀº ºÎ¸ð ÇÁ·Î¼¼½ºÀÌ´Ù. */
write_to_pipe (mypipe[1]);
return EXIT_SUCCESS;
}
}
10.2 ºÎÇÁ·Î¼¼½º¸¦ À§ÇÑ ÆÄÀÌÇÁ.
ÆÄÀÌÇÁ´Â ºÎÇÁ·Î¼¼½º·Î ½ÇÇàµÇ¾îÁö°í ÀÖ´Â ÇÑ ÇÁ·Î±×·½À¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ¹Þ°Å³ª ȤÀº µ¥ÀÌÅ͸¦ º¸³»´Âµ¥ ÀϹÝÀûÀ¸·Î »ç¿ëµÈ´Ù. À̰͵éÀº pipe( ÆÄÀÌÇÁ¸¦ ¸¸µå´Â ), fork(ºÎÇÁ·Î¼¼½º¸¦ ¸¸µé ±â À§ÇÑ ), dup2( Ç¥ÁØ ÀÔ·Â ¶Ç´Â Ãâ·Â ä³Î·Î ÆÄÀÌÇÁ¸¦ »ç¿ëÇϱâ À§ÇÑ ºÎÇÁ·Î¼¼½º ¸¦ À§ÇØ ), ±×¸®°í exec( »õ·Î¿î ÇÁ·Î±×·¥Àº ½ÇÇàÇϱâ À§ÇÑ)À» º¹ÇÕÀûÀ¸·Î »ç¿ëÇÑ´Ù. ¶Ç´Â popen°ú pclose¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
popen°ú pclose¸¦ »ç¿ëÇÔÀ¸·Î ÀÎÇØ¼ ¾ò´Â À̵æÀº »ç¿ëÇϱ⠽±°í Á»´õ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º¸¦ °®´Â´Ù ´Â °ÍÀÌ´Ù. ±×·¯³ª Á÷Á¢ÀûÀ¸·Î Àú¼öÁØ ÇÔ¼ö¸¦ »ç¿ëÇÔÀ¸·Î ÀÎÇØ¼ ÇÁ·Î±×·¥ÀÇ À¯¿¬¼ºÀº ¾òÀ»¼ö°¡ ¾ø ´Ù.
ÇÔ¼ö : FILE * popen (const char *command, const char *mode)
popen ÇÔ¼ö´Â systemÇÔ¼ö¿Í ¸Å¿ì °¡±î¿î ¿¬°üÀ» °®°í ÀÖ´Ù; 23.1Àý [Running a Command], 325 ÆäÀÌÁö ÂüÁ¶. ±×°ÍÀº ºÎÇÁ·Î¼¼½º·Î½á command ½© ¸í·ÉÀ» ½ÇÇàÇÑ´Ù. ±×·¸Áö¸¸ ±× ¸í·ÉÀÌ ¼öÇàµÇ±â ¸¦ ±â´Ù¸®´Â ´ë½Å¿¡, ±×°ÍÀº ºÎÇÁ·Î¼¼½º¿¡ ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±× ÆÄÀÌÇÁ¿¡ ÇØ´çÇÏ´Â ½ºÆ®¸²À» ¸®ÅÏÇÑ ´Ù.
¸¸ÀÏ mode Àμö°¡ "r"·Î Á¤ÇØÁø´Ù¸é, ´ç½ÅÀº ºÎÇÁ·Î¼¼½ºÀÇ Ç¥ÁØ Ãâ·Â ä³Î·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ¹Þ¾Æµé ÀÎ ½ºÆ®¸²À¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö ÀÖ´Ù. ºÎÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ Ç¥ÁØ ÀԷ ä³ÎÀ» »ó ¼Ó¹Þ´Â´Ù. À¯»çÇϰÔ, ¸¸ÀÏ ´ç½ÅÀÌ mode Àμö¸¦ "w"·Î Á¤ÇÑ´Ù¸é, ´ç½ÅÀº ºÎÇÁ·Î¼¼½ºÀÇ Ç¥ÁØ ÀԷ ä ³Î·Î µ¥ÀÌÅ͸¦ º¸³»±âÀ§ÇÑ ½ºÆ®¸²¿¡ µ¥ÀÌÅ͸¦ ¾µ¼ö ÀÖ´Ù. ºÎÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ Ç¥ÁØ Ãâ·Â ä³ÎÀ» »ó¼Ó¹Þ´Â´Ù. ¿¡·¯°¡ ¹ß»ýÇϸé, popen´Â ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. À̰ÍÀº ÆÄÀÌÇÁ³ª ½ºÆ®¸² ÀÌ ¸¸µé¾îÁöÁö ¾Ê¾Ò°Å³ª, ºÎÇÁ·Î¼¼½º°¡ »ý¼ºµÇÁö ¾Ê¾Ò°Å³ª, ȤÀº ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇÁö ¾Ê¾Ò°Å³ª ÇÒ ¶§ ¹ß»ýÇÒ °ÍÀÌ´Ù.
ÇÔ¼ö : int pclose (FILE *stream)
pclose ÇÔ¼ö´Â popenÀ¸·Î ¸¸µé¾îÁø ½ºÆ®¸²À» ´ÝÀ» ¶§ »ç¿ëÇÑ´Ù. ±×°ÍÀº ½Ã½ºÅÛ ÇÔ¼ö·Î½á, ÀÚ½Ä ÇÁ ·Î¼¼½º°¡ Á¾·áµÇ°í ±× »óȲ°ªÀ» ¸®ÅÏÇϱ⸦ ±â´Ù¸°´Ù.
¿©±â¿¡ ´Ù¸¥ ÇÁ·Î±×·¥À» ÅëÇÑ Ãâ·Â ÇÊÅÍ·Î popen°ú pclose¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö º¸¿©ÁÖ´Â ¿¹°¡ ÀÖ ´Ù.
#include <stdio.h>
#include <stdlib.h>
void
write_data (FILE * stream)
{
int i;
for (i = 0; i < 100; i++)
fprintf (stream, "%d\n", i);
if (ferror (stream))
{
fprintf (stderr, "Output to stream failed.\n");
exit (EXIT_FAILURE);
}
}
int
main (void)
{
FILE *output;
output = popen ("more", "w");
if (!output)
{
fprintf (stderr, "Could not run more.\n");
return EXIT_FAILURE;
}
write_data (output);
pclose (output);
return EXIT_SUCCESS;
}
10.3 FIFO Ưº°ÇÑ ÆÄÀϵé.
Ưº°ÇÑ ÆÄÀÏÀÎ FIFO´Â ´Ù¸¥ ¹æ¹ýÀ¸·Î ¸¸µé¾îÁø´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â ÆÄÀÌÇÁ¿Í À¯»çÇÏ´Ù. ÆÄÀÌÇÁ °¡ ÀÛÀÚ ºÒ¸íÀÇ Åë½Å ä³ÎÀÎÁ¡¿¡ ºñÇØ FIFO Ưº°ÈÀÏÀº mkfifo¸¦ È£ÃâÇÔÀ¸·Î½á ÆÄÀÏ ½Ã½ºÅÛ¿¡ »ðÀÔ µÈ´Ù. ÀÏ´Ü ´ç½ÅÀÌ ÀÌ ¹æ¹ýÀ¸·Î FIFO Ưº°ÈÀÏÀ» ¸¸µé¸é, ¾î´À ÇÁ·Î¼¼½ºµµ ÀϹÝÀû ÆÄÀÏÀ» ´Ù·ç´Â°Í °ú °°Àº ¹æ¹ýÀ¸·Î Àб⳪ ¾²±â¸¦ À§ÇØ ±×°ÍÀ» °³¹æ ÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö¸¸, ±×°Í¿¡ ÀÔ·ÂÀ̳ª Ãâ·Â ¸í ·ÉÀ» ÇàÇϱâ Àü¿¡ ¾ç³¡ÀÌ µ¿½Ã¿¡ °³¹æµÇµµ·Ï ÇØ¾ßÇÑ´Ù. º¸ÅëÀÇ ºí·ÏÀ» Àбâ À§Çؼ FIFO¸¦ °³¹æÇÑ
µ¿¾È ¾î¶² ´Ù¸¥ ÇÁ·Î¼¼½º´Â Ãâ·ÂÀ» À§Çؼ °°Àº FIFO¸¦ °³¹æÇÑ´Ù.
mkfifo ÇÔ¼ö´Â Çì´õÆÄÀÏ 'sys/stat.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : int mkfifo (const char *filename, mode_t mode)
mkfifo ÇÔ¼ö´Â filenameÀÇ À̸§À» °¡Áø FIFOƯº°ÈÀÏÀ» ¸¸µç´Ù. mode Àμö´Â ÆÄÀÏÀÇ Çã°¡¸¦ ¼³Á¤ Çϱâ À§ÇØ »ç¿ëµÇ¾îÁø´Ù; 9.8.7Àý [Setting Permissions], 137 ÆäÀÌÁö ÂüÁ¶. ÀϹÝÀûÀ¸·Î, ¼º°øÇϸé mkfifo´Â 0À» ¸®ÅÏÇÑ´Ù. ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì¿¡´Â -1À» ¸®ÅÏÇÑ´Ù. º¸ÅëÀÇ ÆÄÀÏ À̸§ ¹®¹ý¿¡·¯¿¡ ´õ ÇÏ¿© ( 6.2.3Àý [File Name Errors] , 60 ÆäÀÌÁö ÂüÁ¶), ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀǵÈ
¿¡·¯»óȲÀÌ´Ù.
EEXIST
±× À̸§À» °¡Áø ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÑ´Ù.
ENOSPC
µð·ºÅ丮³ª ÆÄÀÏ ½Ã½ºÅÛÀÌ È®ÀåµÇ¾îÁø ¼ö ¾ø´Ù.
EROFS
±× ÆÄÀÏÀÌ µé¾î°¥ µð·ºÅ丮°¡ ¿ÀÁ÷ Àб⠸ðµå ÆÄÀÏ ½Ã½ºÅÛ¿¡ Á¸ÀçÇÑ´Ù.
10.4 ÆÄÀÌÇÁ ÀÔ/Ãâ·ÂÀÇ ¿ø¼Ò¼ö.
Àаųª ¾²¿©Áø ÆÄÀÌÇÁÀÇ µ¥ÀÌÅÍ¿¡¼ ¸¸ÀÏ ±× µ¥ÀÌÅÍÀÇ Å©±â°¡ PIPE_BUF º¸´Ù ÀÛ´Ù¸é ¿ø¼ÒÀÌ´Ù. À̰ÍÀº ½Ã½ºÅÛ¾ÈÀÇ ¾î¶²°Íµµ ºÎºÐÀûÀ¸·Î ¼öÇàµÈ »óȲÀ» ¸»ÇØÁÙ ¼ö ¾ø´Â, Áï°¢ÀûÀ¸·Î ¸¸µé¾îÁø ´ÜÀ§ ÀÇ µ¥ÀÌÅ͸¦ ÂüÁ¶ÇÔÀ» ÀǹÌÇÑ´Ù. ¿ø¼Ò´ÜÀ§ ÀÔ/Ãâ·ÂÀº ¹Ù¸£°Ô ½ÃÀÛµÇÁö ¾Ê¾ÒÀ» °ÍÀÌ´Ù. ( ±×°ÍÀº µ¥ ÀÌÅͳª ¹öÆÛ °ø°£À» È®º¸Çϱâ À§Çؼ ±â´Ù¸± Çʿ䰡 ÀÖ¾úÁö¸¸, ÀÏ´Ü ½ÃÀ۵Ǿú°í, ±×°ÍÀº Áï½Ã ³¡³ ´Ù. ) µ¥ÀÌÅÍÀÇ ¸¹Àº ¾çÀ» Àаųª ¾²´Â °ÍÀº ¿ø¼Ò´ÜÀ§°¡ µÇ¾îÁöÁö ¾ÊÀ» °ÍÀÌ´Ù; ¿¹¸¦ µé¾î, ´Ù¸¥ ÇÁ ·Î¼¼½º°¡ Á¡À¯Çϰí ÀÖ´Â ±â¼úÀڷκÎÅÍÀÇ Ãâ·Â µ¥ÀÌÅÍ´Â Èð¾îÁö°Ô µÉ °ÍÀÌ´Ù. 27.6Àý [Limits for Files], 374 ÆäÀÌÁö¸¦ ÂüÁ¶Çؼ PIPE_BUF ÆÄ¶ó¹ÌÅÍ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾ò¾î¶ó.