Linux API2014. 11. 19. 10:48
리눅스에서 옵션으로 -h 나 --help 같이 두가지 옵션으로 주는 것을 처리해주는 api 인데
직접 작성해 본게 아니라 일단.. 이정도만 정리...

struct option declared in <getopt.h> as

struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;

extern char *optarg;
extern int optind, opterr, optopt;
 
int getopt_long(int argc, char * const argv[],
           const char *optstring,
           const struct option *longopts, int *longindex);

optstring is a string containing the legitimate option characters. If such a character is followed by a colon, the option requires an argument, so getopt() places a pointer to the following text in the same argv-element, or the text of the following argv-element, in optarg. Two colons mean an option takes an optional arg; if there is text in the current argv-element (i.e., in the same word as the option name itself, for example, "-oarg"), then it is returned in optarg, otherwise optarg is set to zero. This is a GNU extension. If optstring contains W followed by a semicolon, then -W foo is treated as the long option --foo. (The -W option is reserved by POSIX.2 for implementation extensions.) This behavior is a GNU extension, not available with libraries before glibc 2. 
 
[링크 : http://linux.die.net/man/3/getopt_long


-D 는 옵션을 필요로 하는 녀석이라 :가 붙게 되어 D:가 기재되고
optarg에 해당 문자의 포인터가 들어가게 되어 strdup나 atoi 등을 이용해서 인자를 사용하게 된다.
int main(int argc, char *argv[])
{
        struct option long_option[] =
        {
                {"help", 0, NULL, 'h'},
                {"device", 1, NULL, 'D'},
                {"rate", 1, NULL, 'r'},
                {"channels", 1, NULL, 'c'},
                {"frequency", 1, NULL, 'f'},
                {"buffer", 1, NULL, 'b'},
                {"period", 1, NULL, 'p'},
                {"method", 1, NULL, 'm'},
                {"format", 1, NULL, 'o'},
                {"verbose", 1, NULL, 'v'},
                {"noresample", 1, NULL, 'n'},
                {"pevent", 1, NULL, 'e'},
                {NULL, 0, NULL, 0},
        };
 
       while (1) {
                int c;
                if ((c = getopt_long(argc, argv, "hD:r:c:f:b:p:m:o:vne", long_option, NULL)) < 0)
                        break;
                switch (c) {
                case 'h':
                        morehelp++;
                        break;
                case 'D':
                        device = strdup(optarg);
                        break;
                case 'r':
                        rate = atoi(optarg);
                        rate = rate < 4000 ? 4000 : rate;
                        rate = rate > 196000 ? 196000 : rate;
                        break;
                }

[링크 : http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html

[링크 : http://forum.falinux.com/zbxe/?mid=C_LIB&page=3&document_srl=408382] getopt()
[링크 : http://forum.falinux.com/zbxe/index.php?document_srl=519764&mid=C_LIB] getopt_long()
[링크 : http://linux.die.net/man/3/getopt]
[링크 : http://linux.die.net/man/3/getopt_long]

'Linux API' 카테고리의 다른 글

lirc - linux IR Remote control  (0) 2015.03.31
vaapi vdpau uvd  (6) 2015.03.26
linux 최대 thread 갯수  (0) 2015.01.22
공유메모리  (0) 2014.09.02
timeval, gettimeofday()  (0) 2013.08.20
Posted by 구차니