Программирование для Linux. Профессиональный подход - [11]

Шрифт
Интервал

В большинстве интерпретаторов команд код завершения последней выполненной программы содержится в специальной переменной >$?. В показанном ниже примере программа >ls вызывается дважды, и оба раза запрашивается код ее завершения. В первом случае программа завершается корректно и возвращает нулевой код, во втором случае она сталкивается с ошибкой (указанный в командной строке файл не найден), поэтому код завершения оказывается ненулевым:

>% ls /

>bin  coda etc  lib        misc nfs proc sbin usr

>boot dev  home lost+found mnt  opt root tmp  var

>% echo $?

>0

>% ls bogusfile

>ls: bogusfile: No such file or directory

>% echo $?

>1

Программа, написанная на языке С или C++, указывает код завершения в операторе >return в функции >main(). Есть и другие методы задания кодов завершения. Они обсуждаются в главе 3, "Процессы". Например, программе назначается определенный код, когда она завершается аварийно (вследствие получения сигнала).

2.1.6. Среда выполнения

Операционная система Linux предоставляет каждой запущенной программе среду выполнения. Под средой подразумевается совокупность пар переменная-значение. Имена переменных среды и их значения являются строками. По существующему соглашению переменные среды записываются прописными буквами.

Некоторые переменные должны быть знакомы большинству читателей, например:

■ >USER — содержит имя текущего пользователя;

■ >HOME — содержит путь к начальному каталогу текущего пользователя;

■ >PATH — содержит разделенный двоеточиями список каталогов, которые операционная система просматривает в поиске вызванной программы;

■ >DISPLAY — содержит имя и номер экрана сервера X Window, на котором отображаются окна графических программ.

Интерпретатор команд, как и любая другая программа, располагает своей средой. Имеются средства просмотра и редактирования переменных среды из командной строки. Например, программа >printenv отображает текущую среду интерпретатора. В разных интерпретаторах есть свой встроенный синтаксис работы с переменными среды. Ниже демонстрируется синтаксис интерпретаторов семейства Bourne shell.

■ Интерпретатор автоматически создает локальную переменную (называемую переменной интерпретатора) для каждой обнаруживаемой им переменной среды. Благодаря этому возможен доступ к переменным среды через выражения вида >$переменная. Например:

>% echo $USER

>samuel

>% echo $HOME

>/home/samuel

■ С помощью команды >export можно экспортировать переменную интерпретатора в переменную среды. Вот как, например, задается значение переменной >EDITOR:

>% EDITOR=emacs

>% export EDITOR

Или короче:

>% export EDITOR=emacs

В программе доступ к переменным среды осуществляет функция >getenv(), объявленная в файле >. В качестве аргумента она принимает имя переменной и возвращает се значение в строковом виде или >NULL, если переменная не определена в данной среде. Для установки и сброса значений переменных среды предназначены функции >setenv() и >unsetenv() соответственно.

Получить список всех переменных среды немного сложнее. Для этого нужно обратиться к специальной глобальной переменной >environ, определенной в GNU-библиотеке языка С. Данная переменная имеет тип >char** и представляет собой массив указателей на символьные строки, последним элементом которого является >NULL. Каждая строка имеет вид >ПЕРЕМЕННАЯ=значение.

Программа, представленная в листинге 2.3, отображает всю свою среду, просматривая в цикле массив >environ.

Листинг 2.3. (print-env.c) Вывод переменных среды

>#include


>/* Массив ENVIRON содержит среду выполнения. */

>extern char** environ;


>int main() {

> char** var;

> for (var = environ; *var != NULL; ++var)

>  printf("%s\n", *var);

> return 0;

>}

He пытайтесь модифицировать массив >environ самостоятельно. Пользуйтесь для этих целей функциями >setenv() и >unsetenv().

Обычно при запуске программа получает копию среды своей родительской программы (интерпретатора команд, если она была запущена пользователем). Таким образом, программы, запущенные из командной строки, могут исследовать среду интерпретатора команд.

Переменные среды чаще всего используют для передачи программам конфигурационной информации. Предположим, к примеру, что требуется написать программу, подключающуюся к серверу Internet. Имя сервера может задаваться в командной строке, но, если оно меняется нечасто, имеет смысл определить специальную переменную среды — скажем, >SERVER_NAME, — которая будет хранить имя сервера. При отсутствии переменной программа берет имя, заданное по умолчанию. Интересующая нас часть программы показана в листинге 2.4.

Листинг 2.4. (client.с) Часть сетевой клиентской программы

>#include

>#include


>int main() {

> char* server_name = getenv("SERVER_NAME");

> if (server_name == NULL)

>  /* переменная среды SERVER_NAME не задана. Используем

>     установки по умолчанию. */

>  server_name = "server.my-company.com";


> printf("accessing server %s\n", server_name);

> /* Здесь осуществляется доступ к серверу... */

> return 0;

>}

Допустим, программа называется >client. Если переменная >SERVER_NAME не задана, используется имя сервера, заданное по умолчанию:

>% client

>accessing server server.my-company.com


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Виртуальная библиотека Delphi

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


Обработка баз данных на Visual Basic.NET

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.


Исчерпывающее руководство по написанию всплывающих подсказок

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


Программное обеспечение встроенных систем. Общие требования к разработке и документированию

Embedded system software. General requirements for development and documentationСтандарт подготовлен в развитие ГОСТ Р ИСО/МЭК 12207-99 «Информационная технология. Процессы жизненного цикла программных средств» с целью учета специфики разработки и документирования программного обеспечения встроенных систем реального времени.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.