-->

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

На нашем литературном портале можно бесплатно читать книгу Linux программирование в примерах, Роббинс Арнольд-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Linux программирование в примерах
Название: Linux программирование в примерах
Дата добавления: 16 январь 2020
Количество просмотров: 546
Читать онлайн

Linux программирование в примерах читать книгу онлайн

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

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

 

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 17 18 19 20 21 22 23 24 25 ... 253 ВПЕРЕД
Перейти на страницу:

#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 /* Если программа не указана, напечатать переменные окружения и выйти. */

193 if (optind == argc)

194 {

195  while (*environ)

196   puts (*environ++);

197  exit(EXIT_SUCCESS);

198 }

Строки 174–179 переносят существующие переменные в новую копию окружения. В глобальную переменную

environ
помещается указатель на пустой локальный массив. Параметр
envp
поддерживает доступ к первоначальному окружению.

Строки 181–184 удаляют переменные окружения, указанные в опции

-u
. Программа осуществляет это, повторно сканируя командную строку и удаляя перечисленные там имена. Удаление переменных окружения основывается на обсуждавшейся ранее особенности GNU
putenv()
: при вызове с одним лишь именем переменной (без указанного значения)
putenv()
удаляет ее из окружения.

После опций в командной строке помещаются новые или замещающие переменные окружения. Строки 189–190 продолжают сканирование командной строки, отыскивая установки переменных окружения в виде '

<i>имя</i>=<i>значение</i>
'.

По достижении строки 192, если в командной строке ничего не осталось, предполагается, что

env
печатает новое окружение и выходит из программы. Она это и делает (строки 195–197).

Если остались аргументы, они представляют имя команды, которую нужно вызвать, и аргументы для передачи этой новой команде. Это делается с помощью системного вызова

execvp()
(строка 200), который замещает текущую программу новой. (Этот вызов обсуждается в разделе 9.1.4 «Запуск новой программы: семейство
exec()
»; пока не беспокойтесь о деталях.) Если этот вызов возвращается в текущую программу, он потерпел неудачу. В таком случае
env
выводит сообщение об ошибке и завершает программу.

200  execvp(argv[optind], &amp;argv[optind]);

201

202  {

203   int exit_status = (errno == ENOENT ? 127 : 126);

204   error(0, errno, &quot;%s&quot;, argv[optind]);

205   exit(exit_status);

206  }

207 }

Значения кода завершения

126
и
127
(определяемые в строке 203) соответствуют стандарту POSIX.
127
означает, что программа, которую
execvp()
попыталась запустить, не существует. (
ENOENT
означает, что файл не содержит записи в каталоге.)
126
означает, что файл существует, но была какая-то другая ошибка.

2.5. Резюме

• Программы на С получают аргументы своей командной строки через параметры

argc
и
argv
. Функция
getopt()
предоставляет стандартный способ для последовательного разбора опций и их аргументов GNU версия
getopt()
предоставляет некоторые расширения, a
getopt_long()
и
getopt_long_only()
дает возможность легкого разбора длинных опций.

• Окружение представляет собой набор пар '

<i>имя</i>=<i>значение</i>
', который каждая программа наследует от своего родителя. Программы могут по прихоти своего автора использовать для изменения своего поведения переменные окружения, в дополнение к любым аргументам командной строки. Для получения значений переменных окружения, изменения их значений или удаления существуют стандартные процедуры (
getenv()
,
setenv()
,
putenv()
и
unsetenv()
). При необходимости можно получить доступ ко всему окружению через внешнюю переменную
environ
или через третий аргумент
char **envp
функции
main()
. Последний способ не рекомендуется.

1 ... 17 18 19 20 21 22 23 24 25 ... 253 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название