Арнольд Роббинс - Linux программирование в примерах

Тут можно читать онлайн Арнольд Роббинс - Linux программирование в примерах - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Кудиц-Образ, год 2005. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Linux программирование в примерах
  • Автор:
  • Жанр:
  • Издательство:
    Кудиц-Образ
  • Год:
    2005
  • Город:
    Москва
  • ISBN:
    5-9579-0059-1
  • Рейтинг:
    4.25/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Арнольд Роббинс - Linux программирование в примерах краткое содержание

Linux программирование в примерах - описание и краткое содержание, автор Арнольд Роббинс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.

Linux программирование в примерах - читать онлайн бесплатно полную версию (весь текст целиком)

Linux программирование в примерах - читать книгу онлайн бесплатно, автор Арнольд Роббинс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Наконец, если за символом опции в optstringследуют два двоеточия, эта опция может иметь необязательный аргумент. (Быстро повторите это три раза!) Такой аргумент считается присутствующим, если он находится в том же элементе argv, что и сама опция, и отсутствующим в противном случае. В случае отсутствия аргумента GNU getopt()возвращает символ опции, а в optargзаписывает NULL. Например, пусть имеем:

while ((с = getopt(argc, argv, "ab::")) != -1)

...

для -bYANKEES, возвращаемое значение будет ' b', a optargуказывает на « YANKEES», тогда как для -bили ' -b YANKEES' возвращаемое значение будет все то же ' b', но в optargбудет помещен NULL. В последнем случае « YANKEES» представляет отдельный аргумент командной строки.

2.3.3. Длинные опции

Функция getopt_long()осуществляет разбор длинных опций в описанном ранее виде. Дополнительная процедура getopt_long_only()работает идентичным образом, но она используется для программ, в которых все опции являются длинными и начинаются с единичного символа ' -'. В остальных случаях обе функции работают точно так же, как более простая функция GNU getopt(). (Для краткости, везде, где мы говорим « getopt_long()», можно было бы сказать « getopt_long()и getopt_long_only()».) Вот объявления функций из справки getopt(3) GNU/Linux:

#include /* GLIBC */

int getopt_long(int argc, char *const argv[],

const char *optstring,

const struct option *longopts, int *longindex);

int getopt_long_only(int argc, char *const argv[],

const char *optstring,

const struct option *longopts, int *longindex);

Первые три аргумента те же, что и в getopt(). Следующая опция является указателем на массив struct option, который мы назовем таблицей длинных опций и который вскоре опишем. Параметр longindex, если он не установлен в NULL, указывает на переменную, в которую помешается индекс обнаруженной длинной опции в longopts. Это полезно, например, при диагностике ошибок.

2.3.3.1. Таблица длинных опций

Длинные опции описываются с помощью массива структур struct option. Структура struct optionопределена в ; она выглядит следующим образом:

struct option {

const char *name;

int has_arg;

int *flag;

int val;

};

Элементы структуры следующие:

const char *name

Это имя опции без предшествующих черточек, например, « help» или « verbose».

int has_arg

Переменная описывает, имеет ли длинная опция аргумент, и если да, какого вида этот аргумент. Значение должно быть одно из представленных в табл. 2.1. Макроподстановки являются некоторыми символическими именами для числовых значений, приведенных в таблице. Хотя числовые значения тоже работают, макроподстановки гораздо легче читать, и вы должны их использовать вместо соответствующих чисел в любом коде, который пишете.

int *flag

Если этот указатель равен NULL, getopt_long()возвращает значение поля valструктуры. Если он не равен NULL, переменная, на которую он указывает, заполняется значением val, a getopt_long()возвращает 0. Если flagне равен NULL, но длинная опция отсутствует, указанная переменная не изменяется.

int val

Если длинная опция обнаружена, это возвращаемое значение или значение для загрузки в *flag, если flagне равен NULL. Обычно, если flagне равен NULL, valявляется значением true/false, вроде 1 или 0. С другой стороны, если flagравен NULL, valобычно содержит некоторую символьную константу. Если длинная опция соответствует короткой, эта символьная константа должна быть той же самой, которая появляется в аргументе optstringдля этой опции. (Все это станет вскоре ясно, когда мы рассмотрим несколько примеров.)

Таблица 2.1. Значения для has_arg

Макроподстановка Числовое значение Смысл
no_argument 0 Опция не принимает аргумент
required_argument 1 Опции требуется аргумент
optional_argument 2 Аргумент опции является необязательным

У каждой длинной опции есть один такой элемент с соответствующими заполненными значениями. В последнем элементе массива все значения должны быть равны нулю. Нет необходимости сортировать массив: getopt_long()осуществляет линейный поиск. Однако, сортировка его по длинным именам может упростить его чтение для программиста.

При первой встрече использование flagи valкажется сбивающим с толку. Давайте сделаем на время шаг назад и рассмотрим, почему это работает именно таким способом В большинстве случаев, обработка опций заключается в установке значений различных флаговых переменных при обнаружении различных символов опций, наподобие этого:

while ((с = getopt(argc, argv, ":af:hv")) != -1) {

switch (с) {

case 'a':

do_all = 1;

break;

case 'f':

myfile = optarg;

break;

case 'h':

do_help = 1;

break;

case 'v':

do_verbose = 1;

break;

... /* Здесь обработка ошибок */

}

}

Когда flagне равен NULL, getopt_long() устанавливает значения переменных за вас . Это снижает число операторов caseв предыдущем switchс трех до одного. Вот пример таблицы длинных опций и код для работы с ней:

int do_all, do_help, do_verbose; /* флаговые переменные */

char *my_file;

struct option longopts[] = {

{ "all", no_argument, &do_all, 1 },

{ "file", required_argument, NULL, 'f' },

{ "help", no_argument, &do_help, 1 },

{ "verbose", no_argument, &do_verbose, 1 },

{ 0, 0, 0, 0 }

};

while ((с =

getopt_long(argc, argv, ":f:", longopts, NULL)) != -1) {

switch (c) {

case 'f':

myfile = optarg;

break;

case 0:

/* getopt_long() устанавливает значение переменной,

просто продолжить выполнение */

break;

... /* Здесь обработка ошибок */

}

}

Обратите внимание, что значение, переданное аргументу optstring, не содержит больше ' a', ' h' или ' v'. Это означает, что соответствующие короткие опции неприемлемы. Чтобы разрешить как длинные, так и короткие опции, вам придется восстановить в switchсоответствующие caseиз первого примера.

На практике следует писать свои программы так, чтобы у каждой короткой опции была также соответствующая длинная опция. В этом случае проще всего установить в flagNULL, а в valсоответствующий единичный символ.

2.3.3.2. Длинные опции в стиле POSIX

Стандарт POSIX резервирует опцию -Wдля специфических для производителя возможностей. Поэтому по определению -Wнепереносимо между различными системами.

Если за Wв аргументе optstringследует точка с запятой (обратите внимание не двоеточие), getopt_long()рассматривает -Wlongoptтак же, как --longopt. Соответственно в предыдущем примере измените вызов следующим образом:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Арнольд Роббинс читать все книги автора по порядку

Арнольд Роббинс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Linux программирование в примерах отзывы


Отзывы читателей о книге Linux программирование в примерах, автор: Арнольд Роббинс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x