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

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

Жанры

Шрифт:

Указатели на каждый из параметров передаются в массиве

argv[]
, таким образом, через
argv[0]
адресуется строка, содержащая имя программы,
argv[1]
указывает на первый параметр и т.д.. до
argv[argc-1]
.

Массив

envp[]
содержит указатели на переменные окружения, передаваемые программе. Каждая переменная представляет собой строку вида
имя_переменной=значение_переменной
. Мы уже познакомились с переменными окружения в главе 1, когда обсуждали командный интерпретатор.
Сейчас же мы остановимся на их программной "анатомии".

Стандарт ANSI С определяет только два первых аргумента функции main

argc
и
argv
. Стандарт POSIX.1 определяет также аргумент
envp
, хотя рекомендует передачу окружения программы производить через глобальную переменную
environ
, как это показано на рис. 2.6:

extern char *environ;

Рекомендуется следовать последнему формату передачи для лучшей переносимости программ на другие платформы UNIX.

Рис. 2.6. Передача переменных окружения

Приведем пример программы, соответствующую стандарту POSIX.1, которая выводит значения всех аргументов, переданных функции main: число переданных параметров, сами параметры и значения первых десяти переменных окружения.

#include <stddef.h>

extern char **environ;

main(int argc, char *argv[]) {

 int i;

 printf("число параметров, переданных программе %s равно %d\n",

argv[0], argc-1);

 for (i=1; i<argc; i++)

if (environ[i] != NULL)

printf("environ[%d] : %s\n", i, environ[i]);

}

В результате компиляции будет создан исполняемый файл программы (по умолчанию a.out). Запустив его, мы увидим следующую информацию:

$ a.out first second 3

число параметров, переданных программе a.out равно 3

argv[1] = first

argv[2] = second

argv[3] = 3

environ[0] : LOGNAME=andy

environ[1] : MAIL=/var/mail/andy

environ[2] : LD_LIBRARY_PATH=/usr/openwin/lib:/usr/ucblib

environ[3] : PAGER=/usr/bin/pg

environ[4] : TERM=vt100

environ[5] : PATH=/usr/bin:/bin:/etc:/usr/sbin:/sbin:/usr/ccs/bin:/usr/local/bin

environ[6] : HOME=/home/andy

environ[7] : SHELL=/usr/local/bin/bash

Максимальный объем памяти для хранения параметров

и переменных окружения программы ограничен величиной
ARG_MAX
, определенной в файле <limits.h>. Это и другие системные ограничения могут быть получены с помощью функции sysconf(2).

Для получения и установки значений конкретных переменных окружения используются две функции: getenv(3C) и putenv(3C):

#include <stdlib.h>

char *getenv(const char *name);

возвращает значение переменной окружения

name
, a

int putenv(const char *string);

помещает переменную и ее значение (

var_name=var_value
) в окружение программы.

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

#include <stddef.h>

#include <stdlib.h>

#include <stdio.h>

main(int argc, char *argv[]) {

 char *term;

 char buf[200], var[200];

 /* Проверим, определена ли переменная TERM */

 if ((term = getenv("TERM")) == NULL)

/* Если переменная не определена, получим от пользователя ее значение и

поместим переменную в окружение программы */

 {

printf("переменная TERM не определена, введите значение: ");

putenv(var);

 } else

/* Если переменная TERM определена, предоставим пользователю возможность

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

 {

printf("TERM=%s. Change? [N]", getenv("TERM"));

gets(buf);

if (buf[0] == 'Y' || buf[0] == 'y') {

printf("TERM=");

gets{buf);

sprintf(var, "TERM=%s", buf);

putenv(var);

printf("new %s\n", var);

}

 }

}

Сначала программа проверяет, определена ли переменная

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

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

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец