Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Вы, вероятно, можете сказать, что запомнить порядок и назначение всех этих программных опций достаточно трудно без необходимости освоения вызывающих идиосинкразию форматов. Часто единственный выход — применение опции -h
(от англ. help ) или страниц интерактивного справочного руководства ( man
), если программист предоставил одну из этих возможностей. Чуть позже в этой главе мы покажем, что функция getopt
предоставляет изящное решение этих проблем. А сейчас, тем не менее, в упражнении 4.1 давайте посмотрим, как передаются аргументы программы.
Далее приведена программа args.c, проверяющая собственные аргументы.
#include
#include
int main(int argc, char *argv[]) {
int arg;
for (arg = 0; arg < argc; arg++) {
if (argv[arg][0] == '-')
printf("option: %s\n", argv[arg]+1);
else
printf("argument %d: %s\n", arg, argv[arg]);
}
exit(0);
}
Когда вы выполните эту программу, она просто выведет свои аргументы и определит опции. Суть в том, что программа принимает строковый аргумент и необязательный аргумент с именем файла, вводимый опцией -f
. Могут быть определены и другие опции.
$ ./args -i -lr 'hi there' -f fred.c
argument 0: ./args
option: i
option: lr
argument 3: hi there option: f
argument 5: fred.с
Как это работает
Программа просто использует аргумент-счетчик argc
для задания цикла, просматривающего все аргументы программы. Она находит опции поиском начального дефиса.
В данном примере, если мы предполагаем, что доступны опции -l
и -r
, то упускаем тот факт, что группа -lr
, возможно, должна интерпретироваться так же, как -l
и -r
.
В стандарте X/Open (который можно найти по адресу http://opengroup.org/) определено стандартное применение опций командной строки (Utility Syntax Guidelines, руководство по синтаксису утилит) и стандартный программный интерфейс для представления переключателей командной строки в программах на языке С: функция getopt
.
getopt
Для того чтобы вам легче было следовать правилам, приведенным в этих руководствах, ОС Linux предлагает очень простое в применении средство getopt
, поддерживающее использование опций со значениями и без них.
#include
int getopt(int argc, char *const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
Функция getopt
принимает параметры argc
и argv
в том виде, в каком они передаются функции main
в программе, и строку спецификатора опций, которая сообщает getopt
, какие опции определены для программы и есть ли у них связанные с ними значения. optstring
— это просто список символов, каждый из которых представляет односимвольную опцию. Если за символом следует двоеточие, это означает, что у опции есть ассоциированное значение, которое будет принято как следующий аргумент. Команда getopt
оболочки bash выполняет аналогичную функцию.
Например, для обработки предыдущего примера можно было бы применить следующий вызов:
getopt(argc, argv, "if:lr");
В нем учтены простые опции -i
, -l
, -r
и -f
, за которыми последует аргумент с именем файла. Вызов команды с теми же параметрами, но указанными в другом порядке, изменит поведение. Вы сможете попробовать сделать это, когда получите пример кода из упражнения 4.2.
Результат, возвращаемый функцией getopt
, — символ следующей опции, хранящийся в массиве argv
(если он есть). Вызывайте getopt
повторно для поочередного получения каждой опции. Функция ведет себя следующим образом.
□ Если опция принимает значение, на него указывает внешняя переменная optarg
.
□ Функция getopt
вернет -1, когда не останется опций для обработки. Специальный аргумент --
заставит getopt
прекратить перебор опций.
□ Функция getopt
вернет ?
, если есть нераспознанная опция, которую она сохранит во внешней переменной optopt
.
□ Если опции требуется значение (например, в нашем примере опции -f
) и не задана никакая величина, getopt
обычно возвращает ?
. Если поместить двоеточие как первый символ в строке опций, при отсутствии заданной величины функция getopt
вернет :
вместо ?
.
Во внешней переменной optind
хранится номер следующего обрабатываемого аргумента. Функция getopt
использует ее, чтобы знать, как далеко она продвинулась. Программы редко нуждаются в установке этой переменной. Когда все аргументы с опциями обработаны, переменная optind
указывает, где в конце массива argv можно найти оставшиеся аргументы.
Некоторые версии функции getopt
прекратят выполнение при обнаружении первого аргумента не опции, вернув значение -1 и установив переменную optind
. Другие, например предлагаемые в ОС Linux, могут обрабатывать опции, где бы они ни встретились в аргументах программы. Учтите, что в данном случае getopt
фактически перепишет массив argv
так, что все аргументы не опции будут собраны вместе, начиная с элемента массива argv[optind]
. В случае версии GNU функции getopt
ее поведение определяется переменной окружения POSIXLY_CORRECT
. Если переменная установлена, getopt
остановится на первом аргументе не опции. Кроме того, некоторые реализации getopt
выводят сообщения об ошибке для незнакомых опций. Имейте в виду, что в стандарте POSIX написано о том, что если переменная opterr
не равна нулю, функция getopt
выведет сообщение об ошибке в stderr
.
Итак, выполните упражнение 4.2.
getopt
В этом упражнении вы используете функцию getopt; назовите новую программу argopt.c.
#include
#include
#include
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, ":if:lr")) != -1) {
switch(opt) {
case 'i':
case 'l':
case 'r':
printf("option: %c\n", opt);
break;
case 'f':
printf("filename: %s\n", optarg);
break;
case ':':
printf("option needs a value\n");
break;
case '?':
printf("unknown option: %c\n", optopt);
break;
}
}
for (; optind < argc; optind++)
printf("argument: %s\n", argv[optind]);
exit(0);
}
Теперь, когда вы выполните программу, то увидите, что все аргументы командной строки обрабатываются автоматически:
$ ./argopt -i -lr 'hi there' -f fred.с -q
option: i
option: l
option: r
filename: fred.c
unknown option: q
argument: hi there
Как это работает
Программа многократно вызывает функцию getopt
для обработки аргументов-опций до тех пор, пока не останется ни одного, в этот момент getopt
вернет -1. Для каждой опции выбирается подходящее действие, включая обработку неизвестных опций и пропущенных значений. Если у вас другая версия getopt
, то вы получите вывод, слегка отличающийся от показанного, — особенно сообщения об ошибках — но смысл будет понятен.
Интервал:
Закладка: