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

на главную - закладки

Жанры

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

Самьюэл Алекс

Шрифт:

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
, объявленная в файле
<stdlib.h>
. В качестве аргумента она принимает имя переменной и возвращает се значение в строковом виде или
NULL
, если переменная не определена в данной среде. Для установки и сброса значений переменных среды предназначены функции
setenv
и
unsetenv
соответственно.

Получить список всех переменных среды немного сложнее. Для этого нужно обратиться к специальной глобальной переменной

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

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

environ
.

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

#include <stdio.h>

/* Массив 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 <stdio.h>

#include <stdlib.h>

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

Вот как задается другой сервер:

% export SERVER_NAME=backup-server.elsewhere.net

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

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Князь Целитель 6

Ткачев Андрей Юрьевич
6. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 6

Патруль времени (сборник)

Уиндем Джон Паркс Лукас Бейнон Харрис
1985. Зарубежная фантастика
Фантастика:
научная фантастика
8.00
рейтинг книги
Патруль времени (сборник)

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Воронцов. Перезагрузка. Книга 5

Тарасов Ник
5. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 5

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Палач

Зайцев Сергей Григорьевич
4. Викс
Фантастика:
фэнтези
7.27
рейтинг книги
Палач

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия