■ getopt 함수란
유닉스나 리눅스에서 프로그램 실행 시 '-a', '-l' 등 별도의 옵션을 줄 수 있다. 이러한 옵션(아규먼트)을 쉽게 처리하기 위해 만들어진 함수가 getopt이다. 유닉스는 unistd.h를 리눅스는 getopt.h 헤더파일을 include하면 사용 할 수 있다. 그리고 이 함수는 main함수에서 많이 사용되고 있다.
모든 C(C++)로 된 프로그램은 보통 main 함수를 정의할 때 아래와 같이 두 개의 파라미터를 가진다. 프로그램이 커맨드 라인에서 인수를 받는 방법은 main 함수를 통해서만 가능하다.
int main(int argc, char *argv[])
argc 파라미터는 커맨드 라인에서 넘어온 인수의 개수를 뜻하며, argv 파라미터는 C 문자열 벡터이다. argv 의 각 요소들은 공백으로 분리된 개별적인 커맨드 라인 인수 문자열이다.
만약 프로그램에서 커맨드 라인 인수들의 구분이 간단하다면, 굳이 getopt 함수를 사용하디 않고 직접 argv로부터 간단하게 하나씩 인수를 가져올 수 있다. 하지만 프로그램이 한정된 인수들의 개수를 갖지 않거나 모든 인수들을 한꺼번에 취하지 않는다면 같은 방법으로 인수들을 취할 수도 있지만 그것을 구문 분석 하기 위해 getopt()를 사용해서 인수들을 처리하는 것이 보다 효과적이다. 예를들어 흔히 사용되어 지는 ls 명령어조차도 "ls -al"과 같은 옵션을 지원한다. ls -al 에서 보듯이 이것은 ls -a -l 로도 사용될수도 있고, ls -l -a 로도 사용될수 있다. 이것을 프로그램 내에서 사용자 정의 함수를 이용해서 처리하려고 하면 보통 일이 아닐것이다. 그럼 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); }
[root@localhost test]# ./testopt -h Usage: ./testopt [OPTION] [FILE] -h 도움말 -f [FILE] 파일출력 -v 버전출력 [root@localhost test]# ./testopt -f ./testopt: option requires an argument -- f Usage: ./testopt [OPTION] [FILE] -h 도움말 -f [FILE] 파일출력 -v 버전출력
'리눅스' 카테고리의 다른 글
vi 에디터 명령어 (2) | 2012.02.08 |
---|---|
VI 편집기 사용법 (1) | 2012.02.08 |
리눅스 lspci 명령어 (2) | 2012.02.08 |
리눅스 Errorno errno (4) | 2012.02.08 |
리눅스 커널의 구조 (1) | 2012.02.08 |