Linux программирование в примерах
Шрифт:
Наконец, мы улучшим предыдущий пример кода, показав оператор
switch
полностью:
int do_all, do_help, do_verbose; /* флаговые переменные */
char *myfile, *user; /* файл ввода, имя пользователя */
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 },
{ "user" , optional_argument, NULL, 'u'},
{ 0, 0, 0, 0 }
};
...
while((c=getopt_long(argc, argv, ":ahvf:u::W;", longopts, NULL)) != -1) {
switch (c) {
case 'a':
do_all = 1;
break;
case 'f':
myfile = optarg;
break;
case 'h':
do_help = 1;
break;
case 'u':
if (optarg != NULL)
user = optarg;
else
user = "root";
break;
case 'v':
do_verbose = 1;
break;
case 0:
/* getopt_long установил переменную, просто продолжить */
break;
#if 0
case 1:
/*
* Используйте этот case, если getopt_long должна
* просмотреть все аргументы. В этом случае добавьте к
* optstring ведущий * символ '-'. Действительный код,
* если он есть, работает здесь.
*/
break;
#endif
case ':': /* отсутствует аргумент опции */
fprintf(stderr, "%s: option '-%c' requires an argument\n",
argv[0], optopt);
break;
case '?':
default: /* недействительная опция */
fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",
argv[0], optopt);
break;
}
}
В своих программах вы можете захотеть сделать для каждого символа опции комментарии, объясняющие их значение. Однако, если вы использовали описательные имена переменных для каждого символа опции, комментарии уже не так нужны. (Сравните
do_verbose
и vflag
.) 2.3.3.4. GNU
getopt
или getopt_long
в программах пользователей Вы можете захотеть использовать в своих программах GNU
getopt
или getopt_long
и заставить их работать на не-Linux системах/ Это нормально; просто скопируйте исходные файлы из программы GNU или из CVS архива библиотеки С GNU (GLIBC) [30] . Исходные файлы getopt.h
, getopt.с
и getopt1.c
. Они лицензированы на условиях меньшей общедоступной лицензии (Lesser General Public License) GNU, которая позволяет включать библиотечные функции даже в патентованные программы. Вы должны включить в свою программу копию файла COPYING.LIB
наряду с файлами getopt.h
, getopt.с
и getopt1.с
.30
См.
http://sources.redhat.com
— Примеч. автора. Включите исходные файлы в свой дистрибутив и откомпилируйте их с другими исходными файлами. В исходном коде, вызывающем
getopt_long
, используйте '#include <getopt.h>
', а не '#include "getopt.h"
'. Затем, при компилировании, добавьте к командной строке компилятора С – I
. Таким способом сначала будет найдена локальная копия заголовочного файла. Вы можете поинтересоваться: «Вот так, я уже использую GNU/Linux. Почему я должен включать
getopt_long
в свой исполняемый модуль, увеличивая его размер, если процедура уже находится в библиотеке С?» Это хороший вопрос. Однако, здесь не о чем беспокоиться. Исходный код построен так, что если он компилируется на системе, которая использует GLIBC, откомпилированные файлы не будут содержать никакого кода! Вот подтверждение на нашей системе:
$ uname -а /* Показать имя и тип системы */
Linux example 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux
$ ls -l getopt.о getopt1.о /* Показать размеры файлов */
– rw-r--r-- 1 arnold devel 9836 Mar 24 13:55 getopt.о
– rw-r--r-- 1 arnold devel 10324 Mar 24 13:55 getopt1.о
$ size getopt.о getopt1.о /* Показать включенные в исполняемый
модуль размеры */
text data bss dec hex filename
0 0 0 0 0 getopt.о
0 0 0 0 0 getopt1.о
Команда
size
печатает размеры различных составных частей двоичного объекта или исполняемого файла. Мы объясним вывод в разделе 3.1 «Адресное пространство Linux/Unix». Что важно понять прямо сейчас, это то, что несмотря на ненулевой размер самих файлов, они не вносят никакого вклада в конечный исполняемый модуль. (Думаем, это достаточно ясно.) 2.4. Переменные окружения
Окружение представляет собой набор пар вида '
имя=значение
' для каждой программы. Эти пары называются переменными окружения. Каждое имя состоит от одной до любого числа буквенно-цифровых символов или символов подчеркивания ('_
'), но имя не может начинаться с цифры. (Это правило контролируется оболочкой; С API может помешать в окружение все, что захочет, за счет возможного запутывания последующих программ.)
Поделиться:
Популярные книги
Страж Кодекса. Книга IV
4. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 1
1. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Матабар. II
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Черный Маг Императора 9
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Земля под ногами. Из истории заселения и освоения Эрец Исраэль. 1918-1948. Книга 2
Научно-образовательная:
история
5.00
рейтинг книги
Ваше Сиятельство 2
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Сирота
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Князь Целитель 8
8. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Бастард рода Неллеров. Книга 1
1. Бастард рода Неллеров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Самые знаменитые произведения писателя в одном томе
Фантастика:
фантастика: прочее
4.00
рейтинг книги
Инженер Петра Великого 4
4. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кровь на клинке
3. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00