프로그래밍 정리/Ubuntu - C

[Ubuntu - 우분투 - C] 명령줄 옵션(3) - 옵션 해석 라이브러리(popt)

주누다 2015. 5. 16. 20:33
반응형


라이브러리 링크 

- '-lpopt' 옵션을 지정해 실행파일을 생성해야함( -l popt )



명령줄 옵션

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

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


명령줄 문자열 예

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' 처럼 '=' 로 연결해 지정하는 것이 관례



옵션 해석 라이브러리 - popt

- 'popt' 라이브러리는 'getopt_long()' 함수를 대신할 강력한 옵션 해석 도구를 제공

- 'libpopt-dev' 패키지를 설치해야함 ( sudo apt-get install libpopt-dev )



옵션 해석 라이브러리 - popt 예제

 

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

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

        struct poptOption optionTable[] = {
                {"bye", 'b', POPT_ARG_NONE, NULL, 'b', "say good-bye", NULL},
                {"name", 'n', POPT_ARG_STRING, &target, 'n',
                        "greeting to <NAME>", "NAME"},
                POPT_AUTOHELP
                POPT_TABLEEND
        };

        optCon = poptGetContext (NULL, argc, argv, optionTable, 0);
        poptSetOtherOptionHelp (optCon, "[OPTIONS]*");

        while( (opt = poptGetNextOpt(optCon)) >= 0){
                switch(opt){
                        case 'b':
                                greeting = "Good-bye, ";
                                break;
                        case 'n':
                                break;
                        default:
                                return EXIT_FAILURE;
                }
        }
        printf("%s%s!\n", greeting, target);
        return EXIT_SUCCESS;
}

- main() 의 인수에 const 추가

  => 그 이유는 'poptSetContext()' 가 요구하는 형과 일치시키기 위해서 한 것임(굳이 할 필요는...)


 poptOption 구조체

- 'getopt_long()' 을 이용했을 때 활용한 'option' 구조체를 대신하는 'poptOPtion'구조체

- 'POPT_AUTOHELP' 라고 적었을 시

  => 자동으로 도움알메시지를 작성

- 'POPT_TABLEEND' 라고 적었을 시

  => 테이블의 끝을 나타내는 긴호로 사용할 수 있음

poptOption 구조체 - 예제

"bye"

'b'

POPT_ARG_NONE

NULL

'b'

"say good-bye"

NULL

 긴 옵션명

짧은

옵션


옵션의 취급 방법

옵션 입수를

대입하는 변수의

포인터

옵션을 해석했을 때의 반환 값

옵션 설명

옵션 설명에

이용하는 인수


ex)

struct poptOption optionTable[] = {
                {"bye", 'b', POPT_ARG_NONE, NULL, 'b', "say good-bye", NULL},
                {"name", 'n', POPT_ARG_STRING, &target, 'n',
                        "greeting to <NAME>", "NAME"},
                POPT_AUTOHELP
                POPT_TABLEEND
        };





 그 밖의 수정

- 'poptOption' 구조체에서 옵션을 정의했다면 'poptGetContext()' 함수로 'popt'에 정보를 전달함

- 'poptSetOtherOptionHelp()' 함수는 자동 생성되는 도움말에 추가 정보를 주는 함수

- 'getopt_long()' 대신 'popGetNextOpt()' 로 변경

- 도움말이 자동으로 작성되므로 함수 'usage()' 같은 도움말 표시 함수를 직접 준비할 필요가 없어짐

- 옵션 인수가 자동으로 설정되므로 case 'n': 의 처리는 아무것도 하지 않아도 됨





반응형