FIFO Ȱ¿ë
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

FIFO

pipe ¿¡ ´ëÇÑ ³»¿ëÀº PipeÀÇ »ç¿ë°ú System V IPC ¿¡ ´ëÇØ¼­¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

FIFO´Â PIPE¿Í´Þ¸® ¸í¸íµÈ(À̸§ÀÌ ÀÖ´Â) ÆÄÀÏÀ» ÅëÇÏ¿© Åë½ÅÀÌ ÀÌ·ç¾îÁö°Ô µÇ¹Ç·Î, ¼­·Î´Ù¸¥ ¼¼¼Ç¿¡ ÀÖ´Â ÇÁ·Î¼¼½º¶óµµ °ü°è¾øÀÌ Åë½ÅÀ» ÇÒ¼ö°¡ ÀÖÀ¸¸ç, ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ¹Þ¾ÆµéÀ̱â À§ÇÑ ¼­¹ö¸ðµ¨À» ¸¸µé¼öÀÖ´Ù. ±×·¯³ª Unix Domain ¼ÒÄϰú´Â ´Þ¸®, ´ÜÀÏÀÇ ÆÄÀÏÁö½ÃÀÚ¸¦ ÅëÇØ¼­ ¿¬°áÀÌ µÇ¹Ç·Î, select µîÀ» ÅëÇÏ¿© ´ÙÁßÀÇ Å¬¶óÀ̾ðÆ®Áß ¿øÇϴ Ŭ¶óÀÌ¾ðÆ®¿¡ ¼±º°ÀûÀ¸·Î Åë½ÅÇÒ¼ö ÀÖ´Â ÁøÁ¤ÇÑ ´ÙÁß ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» ±¸¼ºÇÏ´Â°Ç ½±Áö°¡ ¾Ê´Ù. ÀÌ·²°æ¿ì´Â Unix Domain ¼ÒÄϰú °°Àº ´Ù¸¥ ¹æ¹ýÀ» ã¾ÆºÁ¾ß ÇÒµíÇÏ´Ù.

¾î¶µç ´ÜÁö ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®·Î ºÎÅÍ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¼­ ó¸®ÇÏ´Â °ÍÀ¸·Î ³¡³ª´Â °æ¿ì¿¡´Â (READ ONLY), ¸Å¿ì °£´ÜÇÏ°Ô ÀÌ·¯ÇÑ ¸ðµ¨À» ±¸ÇöÇÒ¼ö ÀÖÀ½À¸·Î »ç¿ëÇϱ⿡ ¸Å¿ì ÆíÇÒ°ÍÀÌ´Ù. ÇϳªÀÇ ¼­¹ö¿Í ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®·Î ±¸¼ºµÇ¾î ÀÖ°í, À̵éÀÌ ¼­·Î ¸Þ½ÃÁö¸¦ ÁÖ°í ¹Þ´Â ¼­ºñ½º¸¦ ¸¸µé°æ¿ì¿¡µµ, ºñ·Ï FIFO °¡ Àбâ/¾²±â¸¦ Áö¿øÇÏÁö¸¸, Á¦´ë·ÎµÈ ÀÛµ¿À» º¸Àå¹Þ±â À§Çؼ­´Â ÀбâÀü¿ëÀÇ FIFO¿Í ¾²±âÀü¿ëÀÇ FIFO¸¦ ¿­¾î¾ß ÇÒ°ÍÀÌ´Ù.

FIFO ÆÄÀÏÀÇ »ý¼ºÀº mkfifo(3)¸¦ »ç¿ëÇϴµ¥, ´ÙÀ½Àº ½ÇÁ¦ FIFO ÆÄÀÏÀ» ¸¸µé¾î³»´Â °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.

¿¹Á¦ : fifo.c
#include <sys/types.h> 
#include <sys/stat.h> 

int main(int argc, char **argv)
{
    if (mkfifo(argv[1], 0666) != 0)
    {
        perror("mkfifo failure : ");
    }

    return 0;
}
À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÑÈÄ ½ÇÇàÇϸé fifo ÆÄÀÏÀÌ ¸¸µé¾îÁö´Âµ¥, À̸¦ ls -al ·Ï È®ÀÎÇØº¸¸é ¾Æ·¡¿Í °°ÀÌ ÆÄÀÏÀÇ Æ¯¼ºÀ» È®ÀÎÇØº¼¼ö ÀÖ´Ù.
[root@localhost test]# ./fifo /tmp/testfifo2
[root@localhost test]# ls -al /tmp/testfifo2
prw-r--r--    1 root     root            0  2¿ù  7 16:26 /tmp/testfifo2
¸¸µé¾îÁø fifo ÆÄÀÏÀÇ Å©±â´Â ÇØ´ç ÆÄÀÏ¿¡ ´ëÇÑ ÀÔ·ÂÀÌ ÀÖ´õ¶ó ÇÏ´õ¶óµµ ±× Å©±â´Â ¾ðÁ¦³ª 0Àε¥ ÀÌÀ¯´Â ÀÔ·ÂÀÌ ÆÄÀÏ·Î ½×ÀÌÁö ¾Ê°í, Ä¿³Î¿¡¼­ À̸¦ ó¸®Çϱ⠶§¹® ÀÌ´Ù. ¸¸µé¾îÁø fifo ÆÄÀÏÀº PIPE ¿Í ´Þ¸®, ÇÁ·Î¼¼½º°¡ Á¾·áÇϰųª, ½Ã½ºÅÛÀ» ¸®ºÎÆÃ ½ÃŰ´õ¶óµµ »ç¶óÁöÁö ¾ÊÀ¸¸ç(ÆÄÀÏÀÌ´Ï ´ç¿¬ÇÏ´Ù), Á÷Á¢ Áö¿öÁÙ¶§±îÁö »ì¾ÆÀÖ°Ô µÈ´Ù. ¸®´ª½º¿¡¼­´Â FIFO¸¦ ¸¸µéµµ·Ï µµ¿ÍÁÖ´Â mkfifo(2)¶ó´Â ÇÁ·Î±×·¥µµ ÀÖÀ¸¹Ç·Î, FIFO ÆÄÀÏÀ» ¸¸µé±â À§Çؼ­ ±»ÀÌ À§ÀÇ ¿¹Á¦Ã³·³ fifo.c ÆÄÀÏÀ» ¸¸µéÇÊ¿ä´Â ¾øÀ» °ÍÀÌ´Ù.

¸¸µé¾îÁø FIFO ÆÄÀÏ·ÎÀÇ Àбâ¹× ¾²±â´Â º¸ÅëÀÇ ÆÄÀÏÀ» À§Çؼ­ »ç¿ëÇÏ´Â open(2)°ú fopen(3) µî ÀϹÝÀûÀÎ ÆÄÀÏ ¿­±â/¿¢¼¼½º ÇÔ¼ö±ºÀ» »ç¿ëÇÏ¸é µÈ´Ù.

¿¹Á¦ : testfifo.c
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

int main()
{
    FILE *fp;

    char buf[255];
    if((fp = fopen("/tmp/testfifo", "rw")) == NULL)
    {
        perror("open error : ");
        exit(0);
    }


    memset(buf, 0x00, 255);
    while(1)
    {
        while(fgets(buf, 255, fp) != NULL)
        {
            printf("%s", buf);
            memset(buf, 0x00, 255);
        }
    }
}
FIFO ¸¦ À§ÇÑ ¸í¸íµÈ ÆÄÀÏÀ̸§Àº "/tmp/testfifo" ·Î Á¤Çß´Ù.
À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÑ´ÙÀ½¿¡ ½ÇÇà½Ã۸é, read ¿¡¼­ ºí·ÏµÇ´Âµ¥, À̶§ /tmp/testfifo ·Î Ç¥ÁØÃâ·Â ½Ã۸é ÇØ´ç ¸Þ½ÃÁö¸¦ read ÇØ¼­ È­¸é¿¡ Ãâ·Â½ÃÄÑ ÁÙ°ÍÀÌ´Ù. echo ¸¦ ÅëÇØ¼­ °£´ÜÇÏ°Ô Å×½ºÆ®¸¦ ÇØº¸ÀÚ
[yundream@localhost /tmp]# echo "hello world" > testfifo


À̹ø¿¡´Â Á»´õ º¹ÀâÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
À§ÀÇ ¿¹Á¦´Â ´ÜÁö ¼­¹öÃø¿¡¼­ ¹Þ¾Æ¼­ »Ñ¸®±â¸¸ Çß¾ú´Âµ¥, À̹ø¿¡´Â Ŭ¶óÀ̾ðÆ®Ãø ¿¡¼­ ¼­¹öÃøÀ¸·Î ¸Þ½ÃÁö¸¦ º¸³»¸é ¼­¹öÃø¿¡¼­ ¸Þ½ÃÁö¸¦ ¹ÞÀº´ÙÀ½ ´Ù½Ã Ŭ¶óÀÌ¾ðÆ® Ãø¿¡ º¸³»°í Ŭ¶óÀ̾ðÆ®Ãø¿¡¼­ ÀÌ °ªÀ» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µéµµ·Ï ÇϰڴÙ

Àбâ/¾²±â¸¦ À§Çؼ­ 2°³ÀÇ FIFO ÆÄÀÏÀ» ¸¸µé¾î¼­ Åë½ÅÀ» ÇÏ°Ô µÉ°ÍÀ̸ç, °¢°¢ÀÇ À̸§Àº fifo_c, fifo_s ·Î Çϵµ·Ï ÇϰڴÙ.
ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÀÏÀº fifo_c.c ¿¡¼­ fifo_s.c ·Î ¼ýÀÚ¸¦ º¸³»¸é fifo_s.c ¿¡¼­´Â ¹ÞÀº ¼ýÀÚ¸¦ "°ÅµìÁ¦°ö" ÇØ¼­ fifo_c.c ·Î ´Ù½Ã º¸³»ÁÖ°í fifo_c ¿¡¼­´Â À̸¦ Ãâ·Â½ÃÄÑÁÖ´Â °£´Ü ÇÁ·Î±×·¥ÀÌ´Ù.
½©¿¡¼­ mkfifo ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ /tmp/fifo_c, /tmp/fifo_s µÎ°³ÀÇ FIFO ÆÄÀÏÀ» »ý¼ºÇϵµ·Ï ÇÏÀÚ.

fifo_s.c
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

#define chop(x) x[strlen(x) - 1] = 0x00 

int main()
{
    int fp_w;
    int fp_r;

    int n;
    char buf_r[11];
    char buf_w[11];
    if((fp_r = open("/tmp/fifo_c", O_RDONLY)) < 0)
    {
        perror("open error : ");
        exit(0);
    }
    if((fp_w = open("/tmp/fifo_s", O_WRONLY)) < 0)
    {
        perror("open error : ");
        exit(0);
    }


    memset(buf_r, 0x00, 11);
    memset(buf_w, 0x00, 11);

    while((n = read(fp_r, buf_r, 11)) > 0)
    {
        printf("%s", buf_r);
        chop(buf_r);
        sprintf(buf_w, "%d\n", atoi(buf_r) * atoi(buf_r));

        write(fp_w, buf_w, 11);

        memset(buf_r, 0x00, 11);
        memset(buf_w, 0x00, 11);
    }
    exit(1);
}
ÇÁ·Î±×·¥ÀÌ ÇÏ´ÂÀÏÀº °£´ÜÇÏ´Ù.
/tmp/fifo_c ¿¡¼­ ¸Þ½ÃÁö¸¦ Àо ÀÌ°É Á¦°öÇØ¼­ /tmp/fifo_s ·Î ¾´´Ù.

fifo_c.c
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

#define chop(x) x[strlen(x) - 1] = 0x00 

int main()
{
    int fp_r;
    int fp_w;
    int n;
    int i;
    char buf_r[11];
    char buf_w[11];

    if((fp_w = open("/tmp/fifo_c", O_WRONLY)) < 0)
    {
        perror("open error : ");
        exit(0);
    }
    if((fp_r = open("/tmp/fifo_s", O_RDONLY)) < 0)
    {
        perror("open error : ");
        exit(0);
    }


    i = 1;

    memset(buf_r, 0x00, 11);
    memset(buf_w, 0x00, 11);
    sprintf(buf_w, "%d\n", i);

    while((n = write(fp_w, buf_w, 11)) > 0)
    {
        read(fp_r, buf_r, 11);

        printf("%6d^2 = %s", atoi(buf_w), buf_r);
        memset(buf_r, 0x00, 11);
        memset(buf_w, 0x00, 11);
        i++;
        sprintf(buf_w, "%d\n", i);
        sleep(1);
    }
}

ÀÌ ÇÁ·Î±×·¥Àº 1ºÎÅÍ ÇÁ·Î±×·¥À» Á¾·á½Ãų¶§±îÁö ¼øÂ÷ÀûÀ¸·Î (1¾¿Áõ°¡) /tmp/fifo_c¿¡ ¾²°í, ±× °á°ú°ª(Á¦°ö)À» /tmp/fifo_s ¿¡¼­ Àоî¿À°í, ±× °ªÀ» È­¸é¿¡ Ãâ·ÂÇÑ´Ù. fifo_s ¸¦ ¸ÕÀú ½ÇÇàÇÏ°í ±×´ÙÀ½ fifo_c ¸¦ ½ÇÇàÇÏ¸é µÈ´Ù. ´ÙÀ½Àº ½ÇÇàÈ­¸éÀÌ´Ù.
[yundream@localhost test]#./fifo_s
1
2
3
4
5
6
7
8
9
10
11

[yundream@localhost test]#./fifo_c
     1^2 = 1
     2^2 = 4
     3^2 = 9
     4^2 = 16
     5^2 = 25
     6^2 = 36
     7^2 = 49
     8^2 = 64
     9^2 = 81
    10^2 = 100
    11^2 = 121
...

°ü·Ã¹®¼­

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