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);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redmine 데이터베이스를 MySQL에서 PostgreSQL로 마이그레이션 (보충)Redmine 의 Database 를 MySQL 로 운용하고 있었습니다만, MySQL 5.6 이상이나 MariaDB 에는 , , 이러한 티켓이 수년 동안 방치된 상황을 감안하여, PostgreSQL로 마이그레이션하기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.