리눅스 프로그래밍에 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요.
https://reakwon.tistory.com/233
getopt로 명령인자 분리
ls -il hello.txt
위와 같은 명령을 구현하고자 할때 명령어에 대한 옵션 분리가 필요합니다. -i 옵션과 -l 옵션이 있고, 위의 명령어에서 hello.txt라는 파일 이름을 줄 수도 있고 안줄 수도 있습니다.
getopt를 모른다면 이 명령 옵션 인자를 스스로 파싱해서 써야할건데 자신있으신가요? 저는 자신이 없어서 getopt를 설명하고자 합니다.
getopt를 사용하기 위해서는 unistd.h 헤더파일을 추가해야합니다.
#include <unistd.h> int getopt(int argc, char* const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; |
getopt는 명령어를 argv에 있는 명령어를 계속적으로 parsing하는데, 정상적으로 파싱이 되면 optstring에서 지정한 문자열이 반환되고 파싱이 전부되었다면 최종적으로 -1을 반환합니다.
어려운거는 별로 없으니 바로 예제를 보도록 하지요.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
void showHelp(const char* thisName){
printf("usage : %s [OPTION] [MESSAGE]\n"
" -h help\n"
" -w [MESSAGE] write file\n"
" -r read file\n"
, thisName);
}
void writeFile(const char* message){
int fd = open("getopt_file.txt",O_RDWR|O_CREAT,0777);
write(fd, message, strlen(message));
close(fd);
}
void readFile(){
char buf[32]={0,};
int n;
int fd = open("getopt_file.txt",O_RDWR|O_CREAT,0777);
while((n = read(fd, buf, sizeof(buf))) > 0)
printf("%s",buf);
close(fd);
}
int main(int argc, char* argv[]){
char opt;
opterr = 0;
if(argc < 2){
showHelp(argv[0]);
exit(0);
}
while((opt = getopt(argc, argv, "hw:r")) != -1){
printf("opt:%c, optopt:%d\n", opt, optopt);
switch(opt){
case 'h':
showHelp(argv[0]);
break;
case 'w':
writeFile(optarg);
break;
case 'r':
readFile();
break;
}
}
}
h는 help 옵션, w는 파일에 write하는 명령 옵션, r은 파일을 읽는데 사용하는 명령 옵션입니다.
다른건 이해가 가실 것이고 optstring을 보면 w옆에 :이 있네요. w는 다음에는 MESSAGE라는 문자열이 오게 되지요. 이처럼 명령어 옵션 이후에 인자가 필요할때 그 문자 다음에 :을 사용하는데요. 명령 다음 인자는 optarg에 저장이 됩니다.
컴파일 후 실행하면서 어떻게 실행되는지 보겠습니다.
# gcc getopt_test.c -o getopt_test # ./getopt_test usage : ./getopt_test [OPTION] [MESSAGE] -h help -w [MESSAGE] write file -r read file # ./getopt_test -h opt:h, optopt:0 usage : ./getopt_test [OPTION] [MESSAGE] -h help -w [MESSAGE] write file -r read file # ./getopt_test -w "hello" opt:w, optopt:0 # ./getopt_test -r opt:r, optopt:0 hello |
만약 hwr이외에 옵션을 주면 어떻게 될까요?
# ./getopt_test -k opt:?, optopt:107 |
알 수 없는 옵션을 주게 되거나 옵션 이후 인자가 필요한데 주지 않으면 ?을 반환하는 것을 알 수 있습니다.
이제 optopt, opterr을 보도록 하지요.
optopt는 getopt가 제대로 실행이 되었다면 0이 되는데, 그렇지 않을 경우 그 문자가 들어갑니다.
opterr은 에러 발생시 출력할지 말지를 정합니다. opterr을 1로 해놓으면 getopt에서 에러메시지를 출력하는데 0을 지정하면 출력하지 않습니다.
'컴퓨터 > 운영체제(주로 리눅스)' 카테고리의 다른 글
[리눅스] 파일 속성 변경 fcntl 사용법과 예제 (0) | 2020.06.28 |
---|---|
[리눅스] 디스크 관련 명령어 df, du 명령어 사용법 (0) | 2020.06.28 |
[리눅스] 프로세스 상태 얻어오기 (wait, waitpid 함수 ) (2) | 2020.05.24 |
[리눅스] dup, dup2 설명 및 쉬운 사용법, 사용 예제(그림 포함) (3) | 2020.05.21 |
[리눅스] 조건변수를 통한 스레드 동기화 설명, 예제(pthread_cond_wait, pthread_cond_signal)와 생산자-소비자 문제 코드 (4) | 2020.04.18 |