|
Программирование >> Программный интерфейс приложений
Флаг. Он используется для запоминания указателя на переменную. Если опция определена, getopt long () сохраняет в переменной значение, указанное в четвертом аргументе. Когда флаг имеет значение NULL , функция getopt long () присваивает переменной optarg значение указателя на значение, следующее за опцией, и возвращает короткое имя опции. Наш массив longoptions [ ] задает значение NULL для всех опций. Значит, функция optlong () возвращает каждый аргумент таким образом, чтобы их можно было обрабатывать в операторе switch. Короткое имя опции (состоящее из одного символа). Короткие имена, хранящиеся в массиве longoptions [ ], должны соответствовать буквам, указанным в строке опций, которые передаются в третьем аргументе функции getopt long {). В противном случае, программа не сможет обработать командную строку соответствующим образом. Массив long options [ ] завершается структурой, все элементы которой равны 0. Пятый аргумент getopt long () является указателем на переменную типа int. Функция getopt long () сохраняет в эту переменную индекс структуры long options [ ], которая имеет отношение к последней перечисленной опции, (showparam это значение не изменяет.) Опция пароля (обозначенная - -password или -р) может принимать различные значения, т е. ее можно задать как - -password или -passvioTd=eaiu napoAb в случае использования длинной формы, или -р, или -рвашпароль в случае использования короткой формы. Факультативная природа значения пароля отражена повторением двоеточия после буквы р в строке аргумента optionalargument в массиве longoptions [ ]. Клиенты СУБД MySQL позволяют опускать значение пароля в командной строке, а затем запрашивают его. Это позволяет не указывать пароль в командной строке, сохраняя его таким образом в тайне. При написании следующей клиентской программы, client4 это будет обязательно учтено и добавлен соответствующий код. Вот пример вызова профаммы showparam и полученных результатов (предполагается, что содержимое конфигурационного файла -/.my.cnf по сравнению с примером showargv не изменилось). % show param -h yet another host х Первоначальный вектор аргументов: host name: (null) user name: (null) password: (null) port number: 0 socket name: (null) Измененный вектор аргументов: arg О arg 1 arg 2 show param -h yet another host arg 3: x Измененный вектор аргументов после load defaults(): arg 0: show param arg 1: --user=paul arg 2: -password=secret arg 3: -host=some host arg 4: -h arg b: yet another host arg 6: x Параметры соединения после getopt long(): host name: yet another host user name: paul password: secret port number: 0 socket name: (null) Вектор аргументов после getopt long(): arg 0: x Этот результат показывает, что имя узла выбирается из командной строки (перекрывая значение, заданное в конфигурационном файле), а имя пользователя и его пароль - из конфигурационного файла. Процедура getopt long() анализирует принятые опции, независимо от способа их задания в короткой (-h имя узла) или длинной (- -user=paul, - -password=secret) форме. Теперь давайте с помощью простых данных посмотрим, как работают подпрограммы обработки полученных опций, а потом используем его как основу для профаммы, которая подключается к серверу, основываясь на любых данных, будь то данные, полученные из командной сфоки или из конфигурационного файла. Полученный исходный текст client4.c приобретет следующий вид: /* client4.c */ ♦include <stdio.h> ♦ include <stdlib.h> /* для atoiO */ ♦include <mysql.h> ♦include common.h ♦include getopt.h ♦define def host name NOLL /* узел, к которому необходимо подключиться (умолчание = localhost) */ ♦define def user name NOLL /* имя пользователя = имени регистрации в системе */ ♦define def password NOLL /* пароль (умолчание = отсутствует )*/ ♦define def port num О /* использовать порт по умолчанию */ ♦ define def socket name NOLL /* использовать разъем по умолчанию */ ♦define def db name NOLL /* база данных (умолчание = отсутствует )*/ char *groups[] = { client , NOLL }; struct option long options(] = { { host , required argument, NULL, h}, { user , required argument, NULL, u), { password , required argument, NULL, p}, { port , required argument, NULL, P}, { socket , required argument, NULL, S}, { host , required argument, NULL, h), { 0, 0, 0, 0 } MYSQL *conn; /* указатель на дескрилтор соединения */ int mam (int argc, char *argv[]) { char *host name = def host name; char *user name = def user name; char *password = def password; unsigned int port num = def port num; char *socket name = def socket name; char *db name = def db name; char passbuf[100); mt ask password = 0; mt c, option index=0; int i; my init load defaults ( my , groups, $argc, Sargv); while ((c = getopt long (argc, argv, h:p: -.u-.P-.S: , long options, &option index)) != EOF) switch (c) { case h: host name = optarg; break; case u: user name = optarg; break; case p: if (!optarg) /* значение отсутствует */ ask password = 1; else /* скопировав пароль, удалите оригинал */ { (void) strncpy (passbuf, optarg, sizeof (passbuf ) -1 ); passbuf [sizeof (passbuf)-!] = \0 ; password = passbuf; while (*optarg) *optarg++ = ; break; case P : port num = (unsigned int) atoi (optarg) ; break; case S : socket name = optarg; break; argc -= optind; /* перемещение указателя на аргументы,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |