Чтение онлайн

на главную

Жанры

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

Роббинс Арнольд

Шрифт:

122 fputs (_("\

123 Set each NAME to VALUE in the environment and run COMMAND. \n\

124 \n\

125 -i, --ignore-environment start with an empty environment\n\

126 -u, --unset=NAME remove variable from the environment\n\

127 "), stdout);

128 fputs(HELP_OPTION_DESCRIPTION, stdout);

129 fputs(VERSION_OPTION_DESCRIPTION, stdout);

130 fputs(_("\

131 \n\

132 A mere - implies -i. If no COMMAND, print the resulting\

133 environment.\n"), stdout);

134 printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);

135 }

136 exit(status);

137 }

Первая

часть
main
объявляет переменные и настраивает локализацию. Функции
setlocale
,
bindtextdomain
и
textdomain
(строки 147–149) обсуждаются в главе 13 «Интернационализация и локализация». Отметим, что эта программа использует аргумент
main envp
(строка 140). Это единственная программа Coreutils, которая так делает. Наконец, вызов
atexit
в строке 151 (см. раздел 9.1.5.3. «Функции завершения») регистрирует библиотечную функцию Coreutils, которая очищает все выходные буферы и закрывает
stdout
, выдавая сообщение при ошибке. Следующая часть программы обрабатывает аргументы командной строки, используя
getopt_long
.

139 int

140 main(register int argc, register char **argv, char **envp)

141 {

142 char *dummy_environ[1];

143 int optc;

144 int ignore_environment = 0;

145

146 program_name = argv[0];

147 setlocale(LC_ALL, "");

148 bindtextdomain(PACKAGE, LOCALEDIR);

149 textdomain(PACKAGE);

150

151 atexit(close_stdout);

152

153 while ((optc = getopt_long(argc, argv, "+iu:", longopts, NULL)) != -1)

154 {

155 switch (optc)

156 {

157 case 0:

158 break;

159 case 'i':

160 ignore_environment = 1;

161 break;

162 case 'u':

163 break;

164 case_GETOPT_HELP_CHAR;

165 case_GETOPT_VERSION_CHAR(PROGRAM_NAME, AUTHORS);

166 default:

167 usage(2);

168 }

169 }

170

171 if (optind != argc && !strcmp(argv[optind], "-"))

172 ignore_environment = 1;

Вот отрывок из файла

src/sys2.h
в дистрибутиве Coreutils с упомянутыми ранее определениями и макросом '
case_GETOPT_xxx
', использованным выше (строки 164–165):

/* Вынесение за скобки общей части кода, обрабатывающего --help и

– -version. */

/* Эти значения перечисления никак не могут конфликтовать со значениями опций,

обычно используемыми командами, включая CHAR_MAX + 1 и т.д. Избегайте

CHAR_MIN - 1, т.к. оно может равняться -1, значение завершения опций getopt.

*/

enum {

 GETOPT_HELP_CHAR = (CHAR_MIN — 2),

 GETOPT_VERSION_CHAR = (CHAR_MIN - 3)

};

#define GETOPT_HELP_OPTION_DECL \

 "help", no_argument, 0, GETOPT_HELP_CHAR

#define GETOPT_VERSION_OPTION_DECL \

 "version", no_argument, 0, GETOPT_VERSION_CHAR

#define case_GETOPT_HELP_CHAR \

 case GETOPT_HELP_CHAR: \

usage(EXIT_SUCCESS); \

break;

#define case_GETOPT_VERSION_CHAR(Program_name, Authors) \

 case GETOPT_VERSION_CHAR: \

version_etc(stdout, Program_name, PACKAGE, VERSION, Authors); \

exit(EXIT_SUCCESS); \

break;

Результатом этого кода является печать сообщения об использовании утилиты для

– -help
и печать информации о версии для
– -version
. Обе опции завершаются успешно («Успешный» и «неудачный» статусы завершения описаны в разделе 9.1.5.1 «Определение статуса завершения процесса».) Поскольку в Coreutils входят десятки утилит, имеет смысл вынести за скобки и стандартизовать как можно больше повторяющегося кода.

Возвращаясь к

env.с
:

174 environ = dummy_environ;

175 environ[0] = NULL;

176

177 if (!ignore_environment)

178 for (; *envp; envp++)

179 putenv(*envp);

180

181 optind = 0; /* Принудительная реинициализация GNU getopt. */

182 while ((optc = getopt_long(argc, argv, "+iu:", longopts, NULL)) != -1)

183 if (optc == 'u')

184 putenv(optarg); /* Требуется GNU putenv. */

185

186 if (optind !=argc && !strcmp(argv[optind], "-")) /* Пропустить опции */

187 ++optind;

188

189 while (optind < argc && strchr(argv[optind], '=')) /* Установить

переменные окружения * /

190 putenv(argv[optind++]);

191

192 /* Если программа не указана, напечатать переменные окружения и выйти. */

Поделиться:
Популярные книги

Мимик нового Мира 14

Северный Лис
13. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 14

"Фантастика 2023-123". Компиляция. Книги 1-25

Харников Александр Петрович
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Фантастика 2023-123. Компиляция. Книги 1-25

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Неудержимый. Книга VIII

Боярский Андрей
8. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Неудержимый. Книга VIII

Чемпион

Демиров Леонид
3. Мания крафта
Фантастика:
фэнтези
рпг
5.38
рейтинг книги
Чемпион

Хочу тебя навсегда

Джокер Ольга
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Хочу тебя навсегда

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Маршал Советского Союза. Трилогия

Ланцов Михаил Алексеевич
Маршал Советского Союза
Фантастика:
альтернативная история
8.37
рейтинг книги
Маршал Советского Союза. Трилогия

Волк 4: Лихие 90-е

Киров Никита
4. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 4: Лихие 90-е

Довлатов. Сонный лекарь 3

Голд Джон
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 3

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Везунчик. Дилогия

Бубела Олег Николаевич
Везунчик
Фантастика:
фэнтези
попаданцы
8.63
рейтинг книги
Везунчик. Дилогия

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12