linux man page : getopt ¸í·ÉÇà ÀÎÀÚ ÆÄ½Ì
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 getopt
2 »ç¿ë¹ý
3 ¼³¸í
3.1 getopt
3.2 getopt_long °ú getopt_long_only
4 ¸®Åϰª
5 ¿¹Á¦
5.1 getopt ¿¹Á¦
5.2 getopt_long ¿¹Á¦
6 °ü·Ã¹®¼­

1 getopt

ÇÁ·Î±×·¥ ½ÇÇà ¸í·ÉÇà ÀÎÀÚ¸¦ ÆÄ½ÌÇÑ´Ù.

2 »ç¿ë¹ý

#include <unistd.h> 
 
int getopt(int argc, char * const argv[], 
    const char *optstring); 
 
extern char *optarg; 
extern int optind, opterr, optopt; 
 
#include <getopt.h> 
 
int getopt_long(int argc, char * const argv[], 
           const char *optstring, 
           const struct option *longopts, int *longindex); 
 
int getopt_long_only(int argc, char * const argv[], 
           const char *optstring, 
           const struct option *longopts, int *longindex); 
 

3 ¼³¸í

3.1 getopt

getopt() ´Â ÀԷ¶óÀÎÀÇ ÀÎÀÚ(arguments)¸¦ ºÐ¼®ÇÑ´Ù. ÇÁ·Î±×·¥ ½ÇÇà¿¡ ÀÇÇØ main()ÇÔ ¼ö¿¡¼­ ³Ñ°ÜÁø argc¿Í argv´Â ÀÎÀÚÀÇ ¼ö¿Í ¹è¿­À» ³ªÅ¸³½´Ù. '-' ¶Ç´Â '--'¸¦ Á¤È®È÷ ±¸ºÐÀ» ÇÏÁö¾ÊÁö¸¸ '-'À¸·Î ½ÃÀ۵Ǵ argvÀÇ ¿ä¼Ò°¡ ¿É¼Ç ¿ä¼Ò(option element)°¡ µÈ´Ù. '-'À¸·Î ½ÃÀÛÇÏ¿© µÚ¿¡ ÀÖ´Â ¹®ÀÚ´Â ¿É¼Ç¹®ÀÚ(option characters)°¡ µÈ´Ù. getopt() ¸¦ ¹Ýº¹ÀûÀ¸·Î È£ÃâÇÏ°Ô µÇ¸é °¢°¢ÀÇ ¿É¼ÇÀÎÀÚ(option element)¿¡¼­ °¢°¢ÀÇ ¿É¼Ç ¹®ÀÚ(option characters)µéÀÌ ¼º°øÀûÀ¸·Î ¹ÝȯµÈ´Ù.

¸¸ÀÏ getopt()°¡ ¶Ç ´Ù¸¥ ¿É¼Ç ¹®ÀÚ°¡ ÀÖÀ½À» ¹ß°ßÇÏ°Ô µÈ´Ù¸é, ÀÌ ¹®ÀÚ¸¦ ¹ÝȯÇϰí, ¿ÜºÎ º¯¼ö optind¿Í Á¤Àû º¯¼ö nextchar¸¦ ¾÷µ¥ÀÌÆ®ÇÔÀ¸·Î¼­, getopt() ÇÔ¼ö°¡ ´Ù½Ã È£ÃâµÇ¾úÀ»¶§ ÇöÀç °Ë»öµÈ ´ÙÀ½ ÀÎÀÚ(argv)¶Ç´Â ´ÙÀ½ ¿É¼ÇºÎÅÍ °Ë»öÇÒ¼ö ÀÖµµ·Ï ÀÖµµ·Ï ÇÑ´Ù.

¸¸ÀÏ ´õÀÌ»óÀÇ ¿É¼Ç ¹®ÀÚ°¡ ¾ø´Ù¸é, getopt()´Â -1 À» ¹ÝȯÇϸç, optind´Â argvµéÁß¿¡ ù¹øÂ° argv-¿ä¼Ò¸¦ °¡¸£Å´À¸·Î¼­ ´õÀÌ»ó ¿É¼ÇÀÌ Á¸ÀçÇÏÁö ¾ÊÀ½À» ¾Ë¸°´Ù. (ÁÖ:argvÀÇ Ã¹¹øÂ°´Â ÇÁ·Î±×·¥ ÀÚ½ÅÀ̸ç, ¿É¼ÇÀÌ ¾Æ´ÏÁÒ.)

optstring optstringÀº ±ÔÄ¢¿¡ ¸Â´Â ¿É¼Ç ¹®ÀÚµéÀÌ Æ÷ÇԵǾî ÀÖ´Â ¹®ÀÚ¿­À» ³ªÅ¸³½´Ù. ¸¸ÀÏ ÀÌ·¯ÇÑ ¹®ÀÚµÚ¿¡ ÄÝ·ÐÀÌ ÀÖ´Ù¸é, ÇØ´ç ¿É¼ÇÀÌ ÀÎÀÚ¸¦ ¿ä±¸ÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. µû¶ó¼­, getopt´Â ÇöÀç argv-¿ä¼Ò¿¡ µÚµû¸£´Â ÅØ½ºÆ® ºÎºÐÀ¸·Î Æ÷ÀÎÅ͸¦ À̵¿½ÃŰ°Å³ª, .IR optarg³»ÀÇ ´ÙÀ½ argv¿ä¼Ò¿¡ ÀÖ´Â ÅØ½ºÆ® ºÎºÐÀ¸·Î Æ÷ÀÎÅ͸¦ À̵¿½ÃŲ´Ù. µÎ°³ÀÇ ÄÝ·Ð(::)Àº ¿É¼ÇÀÌ Ãß°¡ÀûÀÎ ÀÎÀÚ¸¦ ¿ä±¸ÇÔÀ» ³ªÅ¸³½´Ù; ¸¸ÀÏ ÇöÀç argv-¿ä¼Ò¿¡ ÅØ½ºÆ®°¡ Á¸ÀçÇÑ´Ù¸é, optargÀ¸·Î ¹ÝȯµÇ¸ç, ±×·¸Áö ¾Ê´Ù¸é optarg´Â '0'ÀÇ °ªÀ» Áö´Ï°Ô µÈ´Ù. À̰ÍÀº GNU È®ÀåÀÌ´Ù. optstringÀÌ ';'(semicolon)À» ¼ö¹ÝÇÏ´Â W¸¦ Æ÷ÇÔÇÑ´Ù¸é, -W foo´Â long option --foo·Î½á ´Ù·ç¾îÁø´Ù. (kim: foo°¡ ÇϳªÀÇ arg·Î ´Ù·ç¾îÁø´Ù´Â °ÇÁö Å×½ºÆ® ÇÊ¿ä) (-W optionÀº ±¸Çö È®Àåµé¿¡ ´ëÇØ POSIX.2¿¡ ÀÇÇØ ¿¹¾àµÇ¾îÀÖ´Ù.) ÀÌ µ¿ÀÛÀº GNU extensionÀ̸ç, glibc 2 ÀÌÀüÀÇ library¿¡¼­ À̿밡´ÉÇÏÁö ¾Ê´Ù.

±âº»ÀûÀ¸·Î, getopt()´Â argv¸¦ ÀÐÀ½À¸·Î½á argvÀÇ ³»¿ëÀ» Àç¹èÄ¡ÇÏ¿© °á°úÀûÀ¸·Î ¸ðµç non-optionµéÀ» µÚ¿¡ ³õ´Â´Ù. µÎ°³ÀÇ ´Ù¸¥ modeµéÀÌ ¶ÇÇÑ ±¸ÇöµÇ¾îÀÖ´Ù. optstringÀÇ Ã¹¹øÂ° character°¡ '+' À̰ųª ȯ°æº¯¼ö POSIXLY_CORRECT°¡ ¼³Á¤µÇ¾îÀÖ´Ù¸é, option processingÀº non-option argument¿Í ¸¶ÁÖÄ¡¸é¼­ °ð¹Ù·Î ¸ØÃá´Ù. optionstringÀÇ Ã¹¹øÂ° character°¡ '-'À̶ó¸é, °¢ non-option argv-element´Â ¸¶Ä¡ ±×°ÍÀÌ chracter code 1ÀÎ optionÀÇ argument·Î½á ´Ù·ç¾îÁø´Ù. (À̰ÍÀº optionsµé°ú ´Ù¸¥ argv-elementµéÀÌ ¾î¶² ¼ø¼­ ȤÀº µÎ°¡Áö 󸮿¡ ´ëÇØ À¯³äÇÏ´Â °ÍÀÌ ÀÖÀ» °Å¶ó´Â °ÍÀ» ¿¹»óÇÏ°í ¾²¿©Áø ÇÁ·Î±×·¥¿¡ ÀÇÇØ »ç¿ëµÈ´Ù. special argument "--"´Â scanning mode¿¡ °ü°è¾øÀÌ option-scanningÀÇ ¸¶Áö¸·À» °­¿äÇÑ´Ù.

getopt()°¡ option character¸¦ ¾Ë¾ÆÂ÷¸®Áö ¸øÇÑ´Ù¸é, stderr·Î error message¸¦ Ãâ·ÂÇϰí, optopt¾È¿¡ character¸¦ ÀúÀåÇѸç '?'¸¦ returnÇÑ´Ù. È£ÃâÇÏ´Â programÀº opterr¸¦ 0À¸·Î ¼³Á¤ÇÔÀ¸·Î¼­ error message¸¦ ¹æÁöÇÑ´Ù.

getopt()°¡ optstring¿¡ Æ÷ÇÔµÇÁö ¾ÊÀº argv¾È¿¡ option character¸¦ ã°Å³ª missing option argument¸¦ °¨ÁöÇÑ´Ù¸é, '?'¸¦ returnÇϰí external variable optopt¸¦ ½ÇÁ¦ option character·Î ¼³Á¤ÇÑ´Ù. optstringÀÇ (À§¿¡ ¼­¼úµÈ ¾î¶² Ãß°¡ÀûÀÎ '+' ¶Ç´Â '-'¸¦ ¼ö¹ÝÇÏ´Â) ù¹øÂ° character°¡ ':'(colon)À̶ó¸é getopt´Â missing option argument¸¦ °¡¸®Å°´Â '?' ´ë½Å¿¡ ':'¸¦ ¸®ÅÏÇÑ´Ù. error°¡ °¨ÁöµÇ¾ú´Ù¸é, optstringÀÇ Ã¹¹øÂ° character´Â colon(':')ÀÌ ¾Æ´Ï°í external variable opterr´Â 0ÀÌ ¾Æ´Ï¸ç,(±âº»ÀûÀ¸·Î) error message¸¦ Ãâ·ÂÇÑ´Ù.


3.2 getopt_long °ú getopt_long_only

getopt_long()ÇÔ¼ö´Â 2°³ÀÇ dash·Î ½ÃÀ۵Ǵ long optionsÀ» Çã¿ëÇϴ°ÍÀ» Á¦¿ÜÇϰí´Â getopt()¿Í °°ÀÌ µ¿ÀÛÇÑ´Ù. (ÇÁ·Î±×·¥ÀÌ long option¸¸ÀÌ Çã¿ëµÈ´Ù¸é, optstringÀº empty string ("")·Î½á ¸í½ÃµÇ¾îÁú ¼ö ÀÖ´Ù, NULLÀÌ ¾Æ´Ô) Long option nameÀº ¾î¶² Á¤ÀÇµÈ option¿¡ ´ëÇØ Á¤È®È÷ ´ëÀÀµÇ°Å³ª À¯ÀÏÇÑ ´ÜÃàÀ̶ó¸é »ý·«µÉ ¼ö ÀÖ´Ù. long optionÀº --arg=param ¶Ç´Â --arg param ÇüÅÂÀÇ parameter¸¦ ÃëÇÒ ¼ö ÀÖ´Ù.

longopts´Â ´ÙÀ½ÀÇ <getopt.h>¿¡ ¼±¾ðµÇ¾îÁø struct optionÀÇ ¹è¿­ÀÇ Ã¹¹øÂ° ¿ä¼Ò¿¡ ´ëÇÑ pointerÀÌ´Ù.
struct option { 
    const char *name; 
    int         has_arg; 
    int        *flag; 
    int         val; 
}; 
 

°¢ fieldµéÀÇ Àǹ̴Â:
  • name
    • long optionÀÇ À̸§
  • has_arg
    • optionÀÌ argument¸¦ ÃëÇÏÁö ¾Ê´Â´Ù¸é no_argument(¶Ç´Â 0);
    • optionÀÌ ÇϳªÀÇ argument¸¦ ÃëÇÑ´Ù¸é required_argument(¶Ç´Â 1); ¶Ç´Â
    • optionÀÌ Ãß°¡ÀûÀÎ argument¸¦ ÃëÇÑ´Ù¸é optional_argument(¶Ç´Â 2).
  • flag
    ¾î¶»°Ô °á°ú°¡ long option¿¡ ´ëÇØ returnµÇ´ÂÁö ¸í½ÃÇÑ´Ù. flag°¡ NULLÀ̸é, getopt_long()´Â valÀ» returnÇÑ´Ù. (¿¹¸¦ µé¾î, È£ÃâÇÏ´Â programÀº µ¿µîÇÑ short option character·Î val¼³Á¤ ÇÒ °ÍÀÌ´Ù.) ´Ù¸¥ °æ¿ì¶ó¸é, getopt_long()´Â 0À» returnÇϰí flag´Â optionÀÌ ¹ß°ßµÇ¸é val·Î ¼³Á¤ÇÑ variableÀ» °¡¸®Å²´Ù. ±×·¯³ª optionÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é ¹Ù²îÁö ¾Ê°Ô ³»ºñµÐ´Ù.
  • val
    returnµÇ´Â °ªÀ̰ųª flag¿¡ ÀÇÇØ °¡¸®Å°´Â variable·Î ·ÎµåÇÑ´Ù.

arrayÀÇ ¸¶Áö¸· element´Â 0À¸·Î ä¿öÁ®¾ß ÇÑ´Ù.

longindex°¡ NULLÀÌ ¾Æ´Ï¶ó¸é longopts¿¡ »ó´ëÀûÀÎ long optionÀÇ index·Î ¼³Á¤µÈ variableÀ» °¡¸®Å²´Ù.

4 ¸®Åϰª

optionÀÌ ¼º°øÀûÀ¸·Î ã¾ÆÁö¸é, getopt()´Â option character¸¦ returnÇÑ´Ù. ¸ðµç command-line optionµéÀÌ ÆÄ½Ì µÇ¾îÁø´Ù¸é, getopt()Àº -1À» returnÇÑ´Ù. getopt() ÀÌ optstring¾È¿¡ ¾ø´Â option character¿Í ¸¶ÁÖÄ¡¸é, '?'ÀÌ returnµÈ´Ù. getopt() ÀÌ missing argumentÀ» °®´Â option¿¡ ¸¶ÁÖÄ¡¸é, return value´Â optstring³»ÀÇ Ã¹¹ø ° character¿¡ ÀÇÁ¸ÇÑ´Ù.: ':'À̶ó¸é, ':'ÀÌ returnµÈ´Ù; ´Ù¸¥ °æ¿ì '?'ÀÌ returnµÈ´Ù.

getopt_long()°ú getopt_long_only() ¶ÇÇÑ short optionÀ» ¾Ë¾Æº¼ ¶§ option character°¡ returnµÈ´Ù. long option¿¡ ´ëÇØ, flag°¡ NULLÀ̶ó¸é valÀ» retunÇÏ °í, ´Ù¸¥°æ¿ì´Â 0ÀÌ´Ù. Error¿Í -1 return Àº getopt()¿¡ °üÇØ¼­ °°´Ù, ¸ðÈ£ÇÏ°Ô ´ëÀÀÇϰųª °ü°è¾ø ´Â parameter¿¡ ´ëÇØ '?'°¡ ´õÇØÁø´Ù.

5 ¿¹Á¦

5.1 getopt ¿¹Á¦

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
 
void help(); 
void version(); 
int main(int argc, char **argv) 
{  
    int opt; 
    int port_num; 
    int fp; 
    int opt_ok; 
    char file_name[16]; 
    char buf[256]; 
 
    while((opt = getopt(argc, argv, "hvf:")) != -1)  
    { 
        switch(opt)  
        {  
            case 'h': 
                help();  
                break;  
            case 'v': 
                version();   
                break; 
            case 'f': 
                memcpy(file_name, optarg, 16); 
                opt_ok = 1; 
                break; 
        } 
    }  
    if (opt_ok != 1) 
    {  
        help(); 
        exit(0); 
    }  
 
    if (access(file_name, R_OK) != 0) 
    { 
        printf("ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù"); 
        exit(0); 
    } 
    if((fp = open(file_name, O_RDONLY)) == -1) 
    { 
        printf("file open error"); 
        exit(0); 
    } 
 
    memset(buf, '0', 256); 
    while(read(fp, buf, 256) > 0) 
    { 
        printf("%s", buf); 
        memset(buf, '0', 256); 
    } 
} 
 
void help() 
{ 
    printf("Usage: ./testopt [OPTION] [FILE]" 
           "  -h                µµ¿ò¸»" 
           "  -f [FILE]         ÆÄÀÏÃâ·Â" 
           "  -v                ¹öÀüÃâ·Â"); 
    exit(0); 
} 
 
void version() 
{ 
    printf("Version : 1.01"); 
    exit(0); 
} 
 

5.2 getopt_long ¿¹Á¦

#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 
 
void help(char *argv) 
{ 
    printf("Usage : %s options\n", argv); 
    printf("--debug\n--create\n--file [file name]\n--help\n"); 
} 
 
int verbose_flag; 
int main (int argc, char **argv) 
{ 
  int c; 
 
  verbose_flag = 0; 
  while (1) 
    { 
      static struct option long_options[] = 
        { 
          {"debug", no_argument,        0, 'd'}, 
          {"verbose", no_argument,       &verbose_flag, 1}, 
          {"create", no_argument,       0, 'c'}, 
          {"help",   no_argument,       0, 'h'}, 
          {"file",  required_argument,  0, 'f'}, 
          {0, 0, 0, 0} 
        }; 
      /* getopt_long stores the option index here. */ 
      int option_index = 0; 
 
      c = getopt_long (argc, argv, "dchf:", 
                       long_options, &option_index); 
 
      /* Detect the end of the options. */ 
      if (c == -1) 
        break; 
 
      switch (c) 
      { 
          case 0: 
            break; 
 
          case 'd': 
            printf("debug mode\n"); 
            break; 
 
          case 'c': 
            printf("create mode\n"); 
            break; 
 
          case 'f': 
            printf ("file name is `%s'\n", optarg); 
            break; 
 
          case 'h': 
            help(argv[0]); 
            break; 
 
          case '?': 
            help(argv[0]); 
            break; 
          default: 
             help(argv[0]); 
       } 
    } 
    if(verbose_flag) 
      printf("verbos flag is set\n"); 
    return 1; 
} 
 

6 °ü·Ã¹®¼­

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