|
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
...
|
|
|