0w0
명령행 인자 출력 ex1_6.c ex1_7.c 본문
명령행 인자의 전달
[3210w0@localhost source]$ cat ex1_6.c
#include<stdio.h>
//명령행 인자 출력하기
int main(int argc, char *argv[]){ //명령행 인자를 받기 위해 main함수에 argc와 argv를 선언
int n;
printf("argc= %d \n",argc); //인자의 개수를 저장한 argc 값을 출력
for(n=0; n<argc; n++) //각 인자를 담은 argv의 내용을 출력
printf("argv[%d] = %s\n",n,argv[n]);
return 0;
}
getopt 함수는 argv에 optsting에 지정된 옵션과 동일한 옵션 문자가 있으면 해당 문자를 리턴한다.
만일 optsting에서 해당 문자에 콜론이 붙어 있다면 옵션 인자가 있는 경우로, 옵션 인자는 외부 변수인 optarg에 저장된다.
외부 변수 optind는 다음에 처리할 argv의 주소를 저장한다. 초깃값은 1로 설정되어 있다. getopt는 옵션 문자나 옵션 인자의 지정에 오류가 있을 경우 오류 메시지를 출력하고 물음표(?)를 리턴한다.
getopt 함수로 옵션을 처리하려면 유닉스 명령에 대한 기본 규칙을 준수해서 명령행 인자를 입력해야 한다.
관련 규칙
[규칙3] 옵션의 이름은 한 글자여야한다.
[규칙4] 모든 옵션의 앞에는 하이픈(-)이 있어야 한다.
[규칙5] 인자가 없는 옵션은 하나의 -다음에 묶여서 올 수 있다.
[규칙6] 옵션의 첫 번째 인자는 공백이나 탭으로 띄고 입력해야 한다.
[규칙7] 인자가 있어야 하는 옵션에서 인자를 생략할 수 없다.
[규칙9] 명령행에서 모든 옵션은 명령의 인자보다 앞에 와야한다
[규칙10] 옵션의 끝을 나타내기 위해 --을 사용할 수 있다.
[규칙15] 긴 옵션은 -- 다음에 와야 한다. 옵션명으로는 문자나 숫자, -만 사용할 수도 있다.
[규칙16] '--이름=인자' 형태는 긴 옵션의 사용에서 옵션의 인자를 상세하게 지정할 때 사용해야 한다.
[규칙17] 모든 명령은 긴 옵션 --version(-V도 지원)과 --help(?도 지원)를 표준으로 지원해야 한다.
argc, argv = main 함수에서 받은 것을 그대로 지정
optstring = 사용할 수 있는 옵션 문자, 옵션에 인자가 있을 경우 문자 뒤에 ':'추가
optarg = 옵션이 인자 저장
optind = 다음에 처리할 argv의 주소
optopt = 오류를 발생시킨 문자
opterr = 오류 메시지를 출력하지 않으려면 0으로 지정
getopt = 옵션을 정의, 옵션에대한 인자 필요 여부 정의
getopt 함수 사용하기
소스!!
[3210w0@localhost source]$ cat ./ex1_7.c
#include<stdio.h>
#include<unistd.h> //getopt의 헤더파일
int main(int argc, char *argv[]){
int n;
extern char *optarg;
extern int optind;
printf("Current Optind : %d \n",optind);
while((n=getopt(argc, argv, "abc:"))!=-1){ //getopt함수로 인자가 있는지 확인하고 옵션을 읽어온다.
// ':' 콜론이 있으면 옵션뒤에 인자가 필요, (abc: 일경우는 c만 인자 필요, a:b:c: 일경우에는 a,b,c 모두 인자가 필요)
switch(n){
case 'a':
printf("Option : a \n");
break;
case 'b':
printf("Option : b \n");
break;
case 'c':
printf("Option : c, Argument=%s \n", optarg);
//-c 옵션의 인자가 저장된 외부 변수 optag의 값을 출력
break;
}
printf("Next Optind : %d \n", optind);
}
return 0;
}
결과!!
[3210w0@localhost source]$ ./ex1_7 -c hi
Current Optind : 1
Option : c, Argument=hi
Next Optind : 3
[3210w0@localhost source]$ ./ex1_7 -c good
Current Optind : 1
Option : c, Argument=good
Next Optind : 3
[3210w0@localhost source]$
[3210w0@localhost source]$
[3210w0@localhost source]$ ./ex1_7 -a
Current Optind : 1
Option : a
Next Optind : 2
[3210w0@localhost source]$ ./ex1_7 -b
Current Optind : 1
Option : b
Next Optind : 2
[3210w0@localhost source]$ ./ex1_7 -e
Current Optind : 1
./ex1_7: invalid option -- 'e'
Next Optind : 2
[3210w0@localhost source]$ ./ex1_7 -c
Current Optind : 1
./ex1_7: option requires an argument -- 'c'
Next Optind : 2
[3210w0@localhost source]$ ./ex1_7 -c test
Current Optind : 1
Option : c, Argument=test
Next Optind : 3
[3210w0@localhost source]$
'Coding > System Programming' 카테고리의 다른 글
고수준 파일 입출력 (0) | 2016.10.11 |
---|---|
저수준 파일 입출력 (0) | 2016.10.06 |
동적 메모리 할당 malloc realloc (0) | 2016.09.28 |
오류 처리 함수 perror함수, str-error함수 (0) | 2016.09.27 |
Makefile과 make ex1_3_main.c ex1_3_addnum.c (0) | 2016.09.27 |