À¯´Ð½º ÆÄÀÏ ´Ù·ç±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

ÆÄÀÏ ´Ù·ç±â

Unix ´Â ¸ðµç°ÍÀÌ ÆÄÀÏ·Î ÀÌ·ç¾îÁø´Ù. ÀϹÝÀûÀÎ ÅØ½ºÆ® Á¤º¸, ¹ÙÀ̳ʸ® Á¤º¸ »Ó¸¸ ¾Æ´Ï¶ó, ¼ÒÄÏ, ÆÄÀÌÇÁ(FIFO), ÀåÄ¡(device), µð·ºÅ丮±îÁö ÆÄÀÏ·Î °ü¸®¸¦ ÇÑ°Ô µÈ´Ù. ÀÌ·¯ÇÑ °³³äÀº Window »ç¿ëÀÚ¿¡°Ô´Â »ý¼ÒÇÑ °³³äÀÌ µÉ¼ö°¡ ÀÖ´Ù.

À©µµ À־ c: µå¶óÀ̺갡 Unix »ó¿¡¼­´Â /dev/hda1 À̶ó´Â ÆÄÀÏ·Î µÇ¾îÀÖ´Ù´Â Á¡ ÀÚü°¡ óÀ½ Unix ¸¦ Á¢ÇÏ´Â »ç¿ëÀÚ¿¡°Ô´Â ¸Å¿ì È¥µ¿µÇ´Â °³³äÀ¸·Î ´Ù°¡¿Â´Ù. ÀÌ·¸µí ¸ðµç°ÍÀÌ ÆÄÀÏ·Î °ü¸®µÈ´Ù´Â °³³äÀÌ Ã³À½¿¡´Â È¥¶õÀ» °¡Á®´ÙÁÙ¼ö ÀÖÁö¸¸, µ¿ÀÏÇÑ Á¢±Ù ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇØÁֹǷΠÁ¶±Ý¸¸ Àͼ÷ÇØÁö¸é ¸Å¿ì ÈǸ¢ÇÑ °³³äÀ̶õ°É ¾Ë°Ô µÉ°ÍÀÌ´Ù.
== ÆÄÀÏ ¿­±â==
ÆÄÀÏÀ» ¿­±â À§Çؼ­´Â open() ÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. ´ÙÀ½Àº ÆÄÀÏÀ» º¹»çÇØÁÖ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À¸·Î, ¾î¶»°Ô ÆÄÀÏÀ» ¿­¾î¼­, ±×³»¿ëÀ» ÀÐ°í ¾²´ÂÁö¿¡ ´ëÇÑ ³»¿ëÀ» ´ã°í ÀÖ´Ù.

¿¹Á¦ : echo_file.c
#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <stdio.h> 
 
int main(int argc, char **argv) 
{ 
    int fd_in, fd_out; 
    int n; 
    char line[255]; 
 
    if (argc != 3) 
    { 
        printf("Usage : ./echo_file [¿øº»ÆÄÀÏÀ̸§] [º¹»çÆÄÀÏÀ̸§]\n"); 
        exit(0); 
    } 
 
    // ¿øº»ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö, 
    // µ¿ÀÏÇÑ À̸§ÀÇ º¹»çÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö °Ë»çÇÑ´Ù. 
    if (access(argv[1], F_OK) != 0) 
    { 
        printf("ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ½ : %s\n", argv[1]); 
        exit(0); 
    } 
    if (access(argv[2], F_OK) == 0) 
    { 
        printf("ÀÌ¹Ì ÆÄÀÏÀ̸§ÀÌ Á¸ÀçÇϰí ÀÖÀ½ : %s\n", argv[2]); 
        exit(0); 
    } 
 
    // ¿øº»ÆÄÀÏ Àбâ Àü¿ëÀ¸·Î ¿­±â 
    if ((fd_in = open(argv[1], O_RDONLY)) < 0) 
    { 
        perror("file open error"); 
        exit(0); 
    } 
 
    // º¹»çÆÄÀÏÀ̸§À» ¾²±âÀü¿ëÀ¸·Î ¿­±â 
    if ((fd_out = open(argv[2], O_WRONLY|O_CREAT)) < 0) 
    { 
        perror("file open error"); 
        exit(0); 
    } 
 
    memset(line, '\0', 255); 
    while ( (n = read(fd_in, line, 255)) > 0) 
    { 
        write(fd_out, line, n); 
        memset(line, '\0', 255); 
    } 
    close(fd_in); 
    close(fd_out); 
} 
 

ÇÁ·Î±×·¥À» ½ÃÀÛÇÏ°Ô µÇ¸é, °¡Àå¸ÕÀú access(2) ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ º¹»çÇϰíÀÚ ÇÏ´Â ÆÄÀÏÀÌ ÀÖ´ÂÁö, ±×¸®°í º¹»ç½Ãų ÆÄÀϸíÀÌ Á¸ÀçÇÏ´ÂÁö¸¦ °Ë»çÇÑ´Ù. access() ÇÔ¼ö´Â ÆÄÀÏÀÇ »ç¿ëÀÚ ±ÇÇѰú ÆÄÀÏÁ¸Àç ¿©ºÎ¸¦ Å×½ºÆ® Çϱâ À§Çؼ­
¾²À̴µ¥, ¾Æ±Ô¸ÕÆ®·Î Å×½ºÆ®ÇÒ ÆÄÀϸí°ú, Å×½ºÆ® ¸ðµå¸¦ ÀÔ·ÂÇÑ´Ù.

Å×½ºÆ® ¸ðµå´Â R_OK, W_OK, F_OK, X_OK °¡ Àִµ¥, Â÷·Ê´ë·Î "ÀбⰡ´É", "¾²±â°¡´É", "ÆÄÀÏÀÎÁö", "½ÇÇà°¡´É" ¿©ºÎ¸¦ Å×½ºÆ® ÇÏ°Ô µÈ´Ù. ÇØ´ç ¸ðµå¿¡ ´ëÇØ¼­ ÂüÀ̶ó¸é 0À» ¹ÝȯÇÏ°Ô µÈ´Ù.

±×´ÙÀ½¿¡ open(2) ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¿øº»ÆÄÀÏÀ» Àбâ Àü¿ëÀ¸·Î ¿­°í, º¹»çÆÄÀÏÀ̸§À» ¾²±âÀü¿ëÀ¸·Î ¿¬´Ù. º¹»çÆÄÀÏÀ» ¿­¶§ O_CREATE ¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀ» »õ·Î »ý¼º ½ÃÄ×À½À» ÁÖ¸ñÇ϶ó.
open() ÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µÇ¸é, int ÇüÀÇ ÆÄÀÏÁö½ÃÀÚ ¸¦ µÇµ¹·Á Áִµ¥, ÀÌ ÆÄÀÏÁö½ÃÀÚ¸¦ ÅëÇÏ¿©¼­ ÆÄÀÏÀ» Á¶ÀÛÇÏ°Ô µÈ´Ù. open() À» ÅëÇÏ¿© ÆÄÀÏÀ» ¿­¶§¿¡´Â ÆÄÀÏÀ» Àбâ Àü¿ëÀ¸·Î ¿­Áö(O_RDONLY), ¾²±âÀü¿ëÀ¸·Î ¿­Áö(O_WRONLY), Àбâ¹× ¾²±âÀü¿ëÀ¸·Î ¿­Áö(O_RDWR)µîÀ» ÁöÁ¤ÇÒ¼ö ÀÖ´Ù. ±×¹ÛÀÇ ´Ù¾çÇÑ ¿­±â »óŸ¦ ÁöÁ¤ÇÒ¼ö Àִµ¥, ÀÌ´Â man ÆäÀÌÁö¸¦ Âü°í Çϱ⠹ٶõ´Ù.

open() À» ÅëÇØ¼­ ÆÄÀÏ ¿­±â¿¡ ¼º°øÇßÀ¸¸é read() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¿øº»ÆÄÀÏ·Î ºÎÅÍ ÁöÁ¤µÈ ¹ÙÀÌÆ®¸¸Å­ÀÇ ³»¿ëÀ» Àоî¿Í¼­, º¹»ç½Ãų ÆÄÀÏ·Î write() ¸¦ ÀÌ¿ëÇØ¼­ ³»¿ëÀ» ¾²°Ô µÈ´Ù.

¸ðµç ÀÛ¾÷À» ¸¶Ä¡°Ô µÇ¸é open() À» ÅëÇØ »ý¼ºµÈ ÆÄÀÏ Áö½ÃÀÚ¸¦ close() ½ÃÄÑÁØ´Ù. º¸Åë ÇÁ·Î¼¼½º(ÇÁ·Î±×·¥)ÀÌ Á¾·áÇÏ°Ô µÇ¸é, ÀÚµ¿ÀûÀ¸·Î open()µÈ ÆÄÀÏÁö½ÃÀÚ¸¦ ´Ý¾ÆÁÖ±â´Â ÇÏÁö¸¸, ÁÁÀº ÇÁ·Î±×·¡¹Ö ½À°üÀ» À§Çؼ­ ¹Ýµå½Ã close() ¸¦ ÅëÇØ¼­ ÆÄÀÏÀ» ´Ý¾ÆÁֱ⠹ٶõ´Ù.

À̹ø¿¡´Â À§ÀÇ echo_file.c ÀÇ stream ¹öÁ¯À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÆÄÀÏ ÀÛ¾÷¿¡´Â open, write, read À¸·Î ´ëÇ¥µÇ´Â ÀÏ·ÃÀÇ °è¿­°ú, fopen(3), fgets, fputs ·Î ´ëÇ¥µÇ´Â stream °è¿­Áß ÅÃÀÏ ÇØ¼­ ÀÛ¾÷ÀÌ °¡´ÉÇÏ´Ù.

ÀüÀÚ´Â ÆÄÀÏÀ» Àú¼öÁØ¿¡¼­ ´Ù·ç°íÀÚ ÇÒ¶§ »ç¿ëÇϸç, ÈÄÀÚ´Â °í¼öÁØ¿¡¼­ »ç¿ëÇϰíÀÚ ÇÒ ¶§ »ç¿ëÇϴµ¥(À̸¦Å×¸é °£ÆíÇÏ°Ô »ç¿ëÇÒÀû¿¡), fopen °è¿­À» ¾²¸é ÆÄÀÏÀ» line ´ÜÀ§·Î Àоî¿Ã¼ö ÀÖ°í, stream À» »ç¿ëÇÏ¿© ÆÄÀÏÀÇ À§Ä¡¸¦ ÁöÁ¤ÇÒ¼ö À־ ÆÄÀÏÀÇ Á¶ÀÛÀÌ °£ÆíÇÏÁö¸¸, open À» ¾µ°æ¿ì fopen À¸·Î °¡´ÉÇÑ ÀÛ¾÷À» À§Çؼ­ ÀÏÀÏÀÌ ÇÔ¼ö¸¦ ¸¸µé¾î¼­ »ç¿ëÇØ¾ß ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖ´Ù.

´Ü open °è¿­À» »ç¿ëÇÒ°æ¿ì, fopen °è¿­¿¡ ºñÇØ¼­ ´õ ÁÁÀº ¼º´ÉÀ» º¸À̰í, ÆÄÀÏ ±â¼úÀÚ Á¶ÀÛ, select ³ª poll µîÀ» ÅëÇÑ ´ÙÁß ÀÔ/Ãâ·Â µî ÆÄÀÏÀ» ¼¼¹ÐÇÏ°Ô Á¶ÀÛÇÒ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áø´Ù.

¿¹Á¦ : echo_file_f.c
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
 
int main(int argc, char **argv) 
{    
    FILE *fp_in; 
    FILE *fp_out; 
     
    char buf_in[255]; 
 
    if (argc != 3) 
    { 
        printf("Usage : ./echo_file [¿øº»ÆÄÀÏÀ̸§] [º¹»çÆÄÀÏÀ̸§]\n"); 
        exit(0);   
    } 
 
    // ¿øº»ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö,  
    // µ¿ÀÏÇÑ À̸§ÀÇ º¹»çÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö °Ë»çÇÑ´Ù.   
    if (access(argv[1], F_OK) != 0)  
    {  
        printf("ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾ÊÀ½ : %s\n", argv[1]); 
        exit(0); 
    }  
    if (access(argv[2], F_OK) == 0) 
    {   
        printf("ÀÌ¹Ì ÆÄÀÏÀ̸§ÀÌ Á¸ÀçÇϰí ÀÖÀ½ : %s\n", argv[2]); 
        exit(0);  
    }   
 
    fp_in  = fopen(argv[1], "r"); 
    if (fp_in == NULL) 
    { 
        perror("file open error 1 : "); 
        exit(0); 
    } 
    fp_out = fopen(argv[2], "w"); 
    if (fp_out == NULL) 
    { 
        perror("file open error 2 : "); 
        exit(0); 
    } 
 
    memset(buf_in, '\0', 255); 
    while( fgets(buf_in, 255, fp_in) != NULL) 
    { 
        fputs(buf_in, fp_out); 
        memset(buf_in, '\0', 255); 
    } 
 
    fclose(fp_in); 
    fclose(fp_out); 
} 
 
ÀÌ ¿¹Á¦´Â ÀÌÀüÀÇ open À» ÅëÇÑ ¿¹Á¦¿Í fopen() °è¿­ÀÇ ÇÔ¼ö¸¦ ½è´Ù´Â°Í À̿ܿ¡ º°·Î ƯÀÌÇÑ Á¡Àº ¾ø´Â ÇÁ·Î±×·¥ÀÌ´Ù.

´ÜÁö ÀÌ·¯ÇÑ ´Ù¸¥ ¹æ¹ýÀ¸·Îµµ ±¸Çö°¡´ÉÇÏ´Ù´Â °ÍÀ» º¸¿©ÁÖ´Â ¿¹Á¦ÀÌ´Ù. ¸¶Áö¸·À¸·Î Ç¥ÁØÀÔ·ÂÀ» ¹Þ¾Æ¼­ À̰ÍÀ» ÆÄÀÏ·Î ÀúÀåÇÏ´Â °£´ÜÇÑ ¶óÀÎ ¿¡µðÅÍ ÇÁ·Î±×·¥ ¿¹¸¦ µé¾îº¸°Ú´Ù.

¿¹Á¦ : line_edit.c
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
 
int main(int argc, char **argv) 
{ 
    FILE *fp_stdin; 
    FILE *fp_out; 
 
    char buf_in[255]; 
 
    if (argc != 2) 
    { 
        printf("Usage : ./line_edit [ÀúÀåÆÄÀÏÀ̸§]\n"); 
        exit(0); 
    } 
     
    if (access(argv[1], F_OK) == 0) 
    {    
        printf("ÀÌ¹Ì ÆÄÀÏÀÌ Á¸ÀçÇϰí ÀÖÀ½ : %s\n", argv[1]);  
        exit(0); 
    } 
     
    fp_out  = fopen(argv[1], "w"); 
    if (fp_out == NULL) 
    { 
        perror("file open error 1 : "); 
        exit(0); 
    } 
     
    while(fgets(buf_in, 255, stdin) != NULL) 
    {    
        if (strncmp(buf_in,"quit", 5) == 0) 
            break; 
        fputs(buf_in, fp_out); 
    } 
 
    fclose(fp_out); 
}   
 
ÇÁ·Î±×·¥Àº ¼³¸íÇÒ°Ô º°·Î ¾øÀ»Á¤µµ·Î °£´ÜÇÏ´Ù. ÀúÀåÇÒ ÆÄÀÏÀ̸§À» ¾Æ±Ô¸ÕÆ®·Î ÁÖ°í ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é »ç¿ëÀÚ ÀÔ·Â(stdin)À» ±â´Ù¸®´Â ÇÁ·ÒÇÁÆ®°¡ ¶ß°Ô µÇ°í, ¿øÇÏ´Â ¹®ÀÚ¿­À» ÀÔ·ÂÇÏ¸é µÈ´Ù. ¸ðµç ÀÛ¾÷ÀÌ ³¡³µ´Ù¸é Ctrl+D ¸¦ ÀÔ·ÂÇϰųª, quit ¸¦ ÀÔ·ÂÇÏ´Â °ÍÀ¸·Î ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù.
[yundream@localhost test]# ./line_edit my_test6 
hello world? 
okokok? 
I like C  
quit 
[yundream@localhost test]#  
 

stdin(3) Àº Ç¥ÁØ ÀÔ/Ãâ·Â ½ºÆ®¸²À¸·Î (standard I/O streams), Ç¥ÁØÃâ·ÂÀº FILE *stdout, Ç¥ÁØ ¿¡·¯´Â FILE *stderr ·Î Á¤ÀÇ µÇ¾î ÀÖ´Ù.

ÀÌ»óÀ¸·Î ÆÄÀÏÀÇ ÀÐ°í ¾²´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. ´ÙÀ½ Æí¿¡¼­´Â ÆÄÀÏÀÇ »óŸ¦ ¾Ë¾Æº¸°í À̸¦ ¹Ù²Ù´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.