Программирование >>  Программный интерфейс приложений 

1 ... 90 91 92 [ 93 ] 94 95 96 ... 264


Флаг. Он используется для запоминания указателя на переменную. Если опция определена, 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; /* перемещение указателя на аргументы,



1 ... 90 91 92 [ 93 ] 94 95 96 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика