[리눅스 시스템 프로그래밍] 7.4 명령행 인자 활용하기, getopt 함수

앞에서 명령행 인자가 무엇인지 살펴보았습니다. 이번에는 명령행 인자를 효과적으로 활용하기 위해 제공하는 getopt 함수를 살펴볼게요.

#include <unistd.h >

int getopt(int argc, char *const argv[], const char *option);

반환 값: 해당 옵션의 아스키코드 값, 없을 때 EOF(-1)

extern char *optarg;

 
리눅스 시스템에서는 명령어에 옵션을 사용할 때 ‘-‘를 이용합니다. 여러분께서도 “ls -al”, “gcc -o ex ex.c”  등 옵션을 사용해 본 적이 있을 거예요.

이처럼 옵션을 분석할 수 있게 제공하는 시스템 호출이 getopt 함수입니다. getopt 함수에 첫 번째와 두 번째 인자는 main 함수의 argc와 arg를 그대로 전달하고 세 번째 option에 제공하고자 하는 옵션을 전달합니다. 만약 ‘a’, ‘l’ 옵션을 전달하고자 한다면 “al”이라고 전달합니다. 그리고 옵션 뒤에 인자를 사용해야 한다면 ‘:’을 추가합니다. 만약 ‘a’에는 옵션 뒤에 인자를 사용하고 ‘l’에는 옵션 뒤에 인자를 사용하지 않는다면 “a:l”을 전달합니다.

getopt 함수는 이번에 발견한 옵션의 아스키코드 값을 반환하며 옵션 뒤에 인자를 사용하고자 한다면 이미 선언한 optarg를 이용합니다. 그리고 더 이상 옵션을 발견하지 못하면 EOF를 반환합니다.

다음은 ‘a’와 ‘l’ 옵션을 사용하며 ‘a’ 옵션일 때에는 옵션 뒤에 인자를 사용하는 예제 코드입니다.

/**********************************************************************
* ex_opt.c                                                            *
* exmple source – using option                                        *
**********************************************************************/

#include <stdio.h>
#include <unistd.h>

extern char *optarg;

void AddProc();
void ListProc();
void Usage(const char *pname);
int main(int argc, char **argv)
{
    int option=0;

    while((option = getopt(argc, argv, "a:l"))!=EOF)
    {
        switch(option)
        {
            case 'a': AddProc(); break;
            case 'l': ListProc(); break;
            default: Usage(argv[0]); break;
        }
    }
    printf("good bye...\n");
    return 0;
}

void AddProc()
{
    printf("=== Add Proc ===\n");
    printf("Add parameter is %s\n", optarg);
}

void ListProc()
{
    printf("=== List Proc ===\n");
}

void Usage(const char *pname)
{
    printf("Usage: %s [options]\n",pname);
    printf("option: [a] | [l] \n");
    printf("a need Add parameter\n");
    printf("ex) %s -a Hello\n", pname);
    printf("ex) %s -l\n", pname);
}
[그림 7.7] ex_opt 실행 화면
[그림 7.7] ex_opt 실행 화면