Разработка приложений в среде Linux - [195]
>NULL
.Во время обработки параметров обратный вызов можно инициировать в трех точках: до начала обработки, при нахождении параметра в таблице для данного обратного вызова и после завершения обработки. Это дает библиотекам возможность инициализировать любые необходимые им структуры (включая данные, определяемые членом >descrip
), и выполнять любые служебные действия, которые могут понадобиться после завершения обработки (например, очищать динамическую память, выделенную для члена >descrip
). Они всегда вызываются при нахождении параметра, однако в таблице параметров необходимо указать, что их нужно вызывать в двух других местах. Чтобы сделать это, значения >POPT_CBFLAG_PRE
или >POPT_CBFLAG_POST
(или оба) должны объединяться битовым "ИЛИ" со значением >POPT_ARG_CALLBACK
, присвоенным члену >arg
структуры, которая определяет обратный вызов.
Далее показан прототип, который следует использовать для определения функции обратного вызова:
>void callback(poptContext con, enum poptCallbackReason reason,
> const struct poptOption * opt, const char * arg,
> const void * data);
Первый параметр представляет содержимое, синтаксический анализ которого будет выполнен во время инициирования обратного вызова. Следующим параметров является >POPT_CALLBACK_REASON_PRE
, если обработка параметра еще не началась, >POPT_CALLBACK_REASON_POST
, если обработка параметров завершена, или >POPT_CALLBACK_REASON_OPTION
, если в таблице для данного обратного вызова был обнаружен параметр. Если этот параметр является последним, то аргумент opt будет указывать на элемент таблицы параметров для обнаруженного параметра, а аргумент >arg
будет указывать на строку, определяющую аргумент для данного параметра. Если ожидается аргумент, не представленный в виде строки, обратный вызов будет отвечать за проверку типа и преобразование аргумента. Последний параметр для обратного вызова, >data
, представляет собой значение поля >descrip
в элементе таблицы параметров, который задает обратный вызов.
Ниже показан пример библиотеки, которая использует вложенную таблицу >popt
и обратные вызовы для синтаксического анализа некоторых параметров командной строки. Структура данных инициализируется до начала синтаксического анализа командной строки, а затем отображаются последние значения.
> 1: /* popt-lib.с */
> 2:
> 3: #include
> 4: #include
> 5:
> 6: struct params {
> 7: int height, width;
> 8: char*fg,*bg;
> 9: };
>10:
>11: static void callback(poptContext con,
>12: enum poptCallbackReason reason,
>13: const struct poptOption * opt,
>14: const char * arg,
>15: const void * data);
>16:
>17: /* Здесь сохраняются переменные, которые прошли синтаксический анализ. Обычно
>18: глобальные переменные использовать не рекомендуется, зато работать с ними проще.*/
>19: struct params ourParam;
>20:
>21: struct poptOption libTable[] = {
>22: { NULL, '\0',
>23: POPT_ARG_CALLBACK | POPT_CBFLAG_PRE | POPT_CBFLAG_POST,
>24: callback, '\0', (void *) &ourParam, NULL },
>25: { "height", 'h', POPT_ARG_STRING, NULL, '\0', NULL, NULL },
>26: { "width", 'w', POPT_ARG_STRING, NULL, '\0', NULL, NULL },
>27: { "fg", 'f', POPT_ARG_STRING, NULL, '\0', NULL, NULL },
>28: { "bg", 'b', POPT_ARG_STRING, NULL, '\0', NULL, NULL },
>29: { NULL, '\0', POPT_ARG_NONE, NULL, '\0', NULL, NULL }
>30: };
>31:
>32: static void callback(poptContext con,
>33: enum poptCallbackReason reason,
>34: const struct poptOption * opt,
>35: const char * arg,
>36: const void * data) {
>37: struct params * p = (void *) data;
>38: char * chptr = NULL;
>39:
>40: if (reason == POPT_CALLBACK_REASON_PRE) {
>41: p->height = 640;
>42: p->width = 480;
>43: p->fg = "white";
>44: p->bg = "black";
>45: } else if (reason == POPT_CALLBACK_REASON_POST) {
>46: printf("используется высота %d ширина %d передний план %s фон %s\n",
>47: p->height, p->width, p->fg, p->bg);
>48:
>49: } else {
>50: switch (opt->shortName) {
>51: case 'h': p->height = strtol(arg, &chptr, 10); break;
>52: case 'w': p->width = strtol(arg, &chptr, 10); break;
>53: case 'f' : p->fg = (char *) arg; break;
>54: case 'b': p->bg = (char *) arg; break;
>55: }
>56:
>57: if (chptr && *chptr) {
>58: fprintf(stderr, "для %s ожидался числовой аргумент\n",
>59: opt->longName);
>60: exit(1);
>61: }
>62: }
>63: }
>64:
Программа, для которой необходимо обеспечить эти аргументы командной строки, должна включать одну дополнительную строку в своей таблице >popt
. Обычно этой строкой является макрос, задаваемый в заголовочном файле (подобно тому, как реализуется >POPT_AUTOHELP
), но в целях упрощения в данном примере мы просто явным образом покажем эту строку.
> 1: /* popt-nest.c */
> 2:
> 3: #include
> 4:
> 5: /* Обычно это объявление осуществляется в заголовочном файле */
> 6: extern struct poptOption libTable[];
> 7:
> 8: int main(int argc, const char * argv[]) {
> 9: poptContext optCon;
>10: int rc;
>11: struct poptOption options[] = {
>12: { "app1", '\0', POPT_ARG_NONE, NULL, '\0' },
>13: { NULL, '\0', POPT_ARG_INCLUDE_TABLE, libTable,
>14: '\0', "Nested:", }
>15: POPT_AUTOHELP
>16: { NULL, '\0', POPT_ARG_NONE, NULL, '\0' }
Одно из немногих изданий на русском языке, которое посвящено старейшей глобальной компьютерной сети "Fidonet". Сатирический справочник о жизни и смерти самого древнего сетевого сообщества, которое до сих пор существует среди нас.
В пособии излагаются основные тенденции развития организационного обеспечения безопасности информационных систем, а также подходы к анализу информационной инфраструктуры организационных систем и решению задач обеспечения безопасности компьютерных систем.Для студентов по направлению подготовки 230400 – Информационные системы и технологии (квалификация «бакалавр»).
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.Для программистов-пользователей операционной системы UNIX.
Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса.
Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.
Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.