프로그래밍 정리/Ubuntu - C

[Ubuntu - 우분투 - C] 명령줄 옵션(2) - 긴 옵션(getpot_long)

주누다 2015. 5. 15. 23:16
반응형

명령줄 옵션

- 명령줄에 나열된 인수는 두 종류로 분류

- 하나는 명령이 처리할 대상인 데이터
- 다른 하나는 명령의 동작을  지정하는데에 이용


명령줄 문자열 예

ex) gcc list0612A.c -o list0612A

=> gcc(명령어) list0612A.c(처리 대상) -o(옵션) list0612A(옵션의 인수)


옵션 지정 예

- 보통 '-h'나 '-?', '--help', '--usage' 같은 옵션

 => 간단한 도움말이나 명령의 사용법을 표시하는데 이용

- '--version' 을 지정했을 때 버전 번호를 표시하게 구현하는 것이 일반적으로 약속처럼 되어 있음



옵션 해석

- 프로그램에서  옵션을 해석하는 법

- 명령줄 옵션을 해석할 때는 'getopt()'와 'getopt_long()'을 사용

- 이들 함수가 표준 C 라이브러리에 포함되므로 따로 패키지를 준비할 필요는 없음

 => #include <unistd.h>




짧은 옵션

-'-(하이픈)'에 이어서 영문자, 숫자, 기호 단일 자로 나타내는 옵션 형식

- gcc 옵션에서 '-c' 와 '-o'가 짧은 옵션에 해당함

- '-c' 옵션은 그 자제로 완결돼 인수가 필요하지 않음

- 생성할 실행 파일의 이름을 지정하는 '-o' 옵션은 입수가 필요함

- 옵션의 인수는 옵션 문자에 바로 붙여서 지정하거나 공백으로 구별해서 지정



 긴 옵션

- '--help' 처럼 '--(하이픈 두 개)'에 이어서 단어로 표현하는 옵션 형식

- 긴 옵션의 인수는 '--longopt=argument' 처럼 '=' 로 연결해 지정하는 것이 관례




 긴 옵션 해석 예제 

 

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

void usage(char* cmd){
        fprintf(stderr, "usage: \n");
        fprintf(stderr, " %s -h  : show help\n", cmd);
        fprintf(stderr, " %s -b  : say good-bye\n", cmd);
        fprintf(stderr, " %s -n <name> : greeting to <name>\n", cmd);
}


int main(int argc, char* argv[]){
        int opt;
        char* greeting = "Hello, ";
        char* target = "world";

        int option_index = 0;

        struct option long_options[] = {
                {"bye", 0, NULL, 'b'},
                {"help", 0, NULL, 'h'},
                {"name", 1, NULL, 'n'},
                {0, 0, 0, 0}
        };

        while( (opt = getopt_long (argc, argv, "bhn:",
                        long_options, &option_index) ) != -1){
                printf("opt : %d, %c\n", opt, opt);

                switch(opt){
                        case 'b':
                                printf("case b\n");
                                greeting = "Good-bye, ";
                                break;
                        case 'n':
                                printf("case n\n");
                                target = optarg;
                                break;
                        case 'h': /* fall-through */
                        default:
                                printf("default\n");
                                usage(argv[0]);
                                return EXIT_FAILURE;

                }
        }
        printf("%s%s!\n", greeting, target);
        return EXIT_SUCCESS;
}


- 'unistd.h' 를 포함하는 대신 'getopt.h'를 포함

- 'getopt_long()' 이 'getopt.h' 파일에 선언되었기 때문

- while 문의 조건에서 사용된 'getopt()' 함수가 'getopt_long()' 함수로 변경

- 네 번째와 다섯 번째 인수로, 새로 추가된 'long_options'와 변수 'option_index'의 포인터가 주어진다는 점에 주의




options 구조체

- 긴 옵션과 이름과 동작은 option 구조체를 이용해 지정

- 헤더 파일 'getopt.h' 에 정의


struct option

{

    const char *name;

    int has_arg;

    int *flag;

    int val;

};



- 첫 번째 인수 'name' 은 문자 그대로 긴 옵셥의 이름을 정의하는 멤버 변수

- 두 번째 인수 'has_arg'는 옵션 인수가 필요한지 지정

'has_arg' 옵션 인수의 지정

 has_arg의 지정

 의미

0

- 옵션 인수가 필요없음

1

- 옵션 인수가 필요함

2

- 옵션 인수가 필요하지만 생략이 가능


- 세 번째 인수 'flag'는옵션 인수를 해석한 결과를 대입할 변수의 포인터를 줌

- 변수의 포인터 대신 NULL을 넣어두면 getopt_long()은 그 결과를 반환 값으로 돌려줌





NULL과 0

- option 구조체의 변수 flag 로 NULL을 지정하면 getopt_long()의 동작이 변한다고 했음

- 온라인 메뉴얼에 있는 예제에서는 NULL 대신 0을 사용

static struct option long_options[] = {

   {"add", 1, 0, 0},

   {"append", 0, 0, 0},

    ...

   {"file", 1, 0, 0},

   {0, 0, 0, 0}

};


- '/usr/lib/gcc/i486-linux-gnu/4.4.3/include/stddef.h' 정의 확인




반응형