블로그 이미지
GUCCI

카테고리

전체보기 (111)
여행 (1)
기기 (2)
쇼핑 (0)
게임 (0)
etc. (6)
취업이야기 (0)
업무일지 (5)
리눅스 (38)
웹프로그래밍 (2)
네트워크 (4)
JAVA (17)
Android (0)
IOS (2)
LUA (8)
C/C++ (1)
Objective C (2)
SERVER (2)
그누보드4 (1)
MSSQL (2)
Programming (1)
자바스크립트 (4)
HTML/CSS (1)
LGNAS (0)
Total
Today
Yesterday

'getopt'에 해당되는 글 1건

  1. 2012.02.08 getopt() 5

getopt()

리눅스 / 2012. 2. 8. 19:01

■ 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 함수 사용예제를 보자.

 

■ getopt를 이용한 프로그램 인자 처리  

 getopt 를 이용해서 다양한 옵션을 처리하는 testopt 라는 프로그램을 만들어 보도록 하겠다. 프로그램 이름은 testopt.c로 하겠다.

#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); 
} 
 

매우 간단하고 이해가 쉬운 예제이다. getopt 를 이용해서 프로그램의 인자를 검사 해서 '-' 가 앞에 붙어 있는 인자는 옵션으로 간주해서 "hvf" 중 어느 옵션인지를 건사해서 해당 루틴을 실행시켜준다. 단 "f" 의 경우에는 ":" 가 붙어 있는데, 이는 "f" 옵션은 반드시 뒤에 값이 따라야 함을 명시하고 있다. 여기에서 값이란 화면에 출력하고픈 파일이름이다. 
[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                            버전출력 

[출처] getopt()|작성자 시대유감


'리눅스' 카테고리의 다른 글

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
Posted by GUCCI
, |

최근에 달린 댓글

글 보관함