ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 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µéÀÇ Àǹ̴Â:
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; } |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|