앞에서 명령행 인자가 무엇인지 살펴보았습니다. 이번에는 명령행 인자를 효과적으로 활용하기 위해 제공하는 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); }