PostgreSQL 의 initdb 소스 코드 분석 3

10221 단어 PostgreSQL
계속 하 다
사실 앞 에 연결 하면 전체 while 순환 은 다음 과 같 습 니 다.
    while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:", long_options, &option_index)) != -1)
    {
        switch (c)
        {
                     ......
                }
                
                ......
         }

이 한 마디, c = getoptlong(argc, argv, "dD:E:L:nU:WA:sT:X:", long_options, &option_index),
initdb 를 얻 은 후에 따 르 는 것 은 - D 또는 - E 와 같은 것 을 제외 하고 또 하나의 용 도 는 전역 변 수 를 주 는 것 이다. optarg 할당.이 전역 변 수 는 사실 아버 지 를 매우 난처 하 게 한다.
/*
 * getopt_long
 *    Parse argc/argv argument vector, with long options.
 *
 * This implementation does not use optreset.  Instead, we guarantee that
 * it can be restarted on a new argv array after a previous call returned -1,
 * if the caller resets optind to 1 before the first call of the new series.
 * (Internally, this means we must be sure to reset "place" to EMSG before
 * returning -1.)
 */
int
getopt_long(int argc, char *const argv[],
            const char *optstring,
            const struct option * longopts, int *longindex)
{
    ......
    if (!*place)
    {                            /* update scanning pointer */
        ......

        if (place[0] && place[0] == '-' && place[1])
        {
            ......for (i = 0; longopts[i].name != NULL; i++)
            {
                if (strlen(longopts[i].name) == namelen
                    && strncmp(place, longopts[i].name, namelen) == 0)
                {
                    if (longopts[i].has_arg)
                    {
                        if (place[namelen] == '=')
                            optarg = place + namelen + 1;
                        else if (optind < argc - 1)
                        {
                            optind++;
                            optarg = argv[optind];
                        }
                        else
                        {
                            ......
                        }
                    }
                    else
                    {
                        ......
                    }

                    ......
                }
            }
            ......
        }
    }

    ......

    if (oli[1] != ':')
    {                            /* don't need argument */        ......
    }
    else
    {                            /* need an argument */
        if (*place)                /* no white space */
            optarg = place;
        else if (argc <= ++optind)
        {                        /* no arg */            ......
        }
        else
            /* white space */
            optarg = argv[optind];
        place = EMSG;
        ++optind;
    }
    return optopt;
}

내 가 운행 을 통 해 얻 은 것 은:
optarg 변수의 값 은? /home/pgsql/DemoDir。
아래 코드 를 통 해 pgdata 할당  /home/pgsql/DemoDir。
    /* process command-line options */

    while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:", long_options, &option_index)) != -1)
    {
        switch (c)
        {
            case 'A':
                authmethod = xstrdup(optarg);
                break;
            case 'D':

                pg_data = xstrdup(optarg);
                break;
                         ......
                 }
                 ......
         }

계속 분석 해.
main 함수 의 다음 단락, 그 중의 option d 도 앞의 것 입 니 다. getopt_long 함수 가 계 산 했 습 니 다. 제 가 실행 할 때 그 값 은 3 입 니 다.
다음 코드 는 이상 처리 입 니 다. 건 너 뛸 수 있 습 니 다.
    if (optind < argc)
    {
        pg_data = xstrdup(argv[optind]);
        optind++;
    }
if (optind < argc)
    {
        fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")
"), progname, argv[optind + 1]); fprintf(stderr, _("Try \"%s --help\" for more information.
"), progname); exit(1); }

좋은 웹페이지 즐겨찾기