Выполнение программы начинается с создания в памяти её образа и связывания с процессом структур ядра ОС, инициализации и передачи управления инструкциям программы. Завершение программы приводит к освобождению памяти и соответствующих структур ядра. Образ программы в памяти содержит сегменты инструкций и данных, созданных компилятором, а также стек, которым пользуется программа в ходе выполнения.
Окружение – набор переменных и их значений, с помощью которых программе можно передавать данные общего назначения.
Описание головной функции программы может выглядеть или так:
main (int argc, char *argv[], char *envp[]);
или так:
extern char **environ; // глобальная переменная, указывающая на строки
// с переменными окружения.
main (int argc, char *argv[]);
argc - определяет число параметров, переданных программе, включая её имя. Указатели на каждый из этих параметров хранятся в массиве, являющемся указателем на эти аргументы.
Второй массив - массив указателей на переменные окружения, передаваемые программе. Каждая переменная содержит строку вида:
|
|
HOME=/home/student/851003.
Основные переменные окружения следующие.
HOME - имя каталога, который становится текущим после входа пользователя в систему.
PATH - последовательность полных файловых путей, разделенных двоеточием, которые используются некоторыми программами для поиска файлов, заданных относительным именем.
TERM - тип терминала
TZ - информация о часовом поясе.
LOGNAME - регистрационное имя пользователя.
LC_NUMERIC - значение категории локализации, определяющей правила национального представления чисел с плавающей точкой.
LC_TIME - значение категории локализации, определяющей правила национального представления времени и даты.
Пример.
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
void main(int argc, char *argv[])
{
char *ch;
char bufer[200], var[200];
if ((ch=getenv("MYVAR"))==NULL)
{
printf("Переменная MYVAR не определена. Введите значение: ");
gets(bufer);
sprintf(var,"MYVAR=%s",bufer);
putenv(var);
printf("Новое значение %s \n",var);
}
else
{
printf("MYVAR=%s. Изменить? ",ch);
gets(buf);
if (buf[0]=='Y' || buf[0]=='y')
{
printf("Новое значение: ");
gets(buf);
sprintf(var,"MYVAR=%s",bufer);
putenv(var);
printf("Новое значение MYVAR=%s",var);
}
}
}
char *getenv (const char *name);
int putenv(const char *string);
Для получения и установки значений переменной окружения применяются две функции: getenv возвращает значение переменной окружения, имеющей имя name; putenv помещает переменную и ее значение в окружение программы. Переменные окружения позволяют передать программе некоторую информацию, однако большую часть информации программа получает от пользователя в ходе ее выполнения.
Вводимое новое значение переменной окружения будет действительно только для данного процесса и порожденных им процессов. После завершения текущего процесса измененная переменная окружения принимает исходное значение.
|
|
Можно модифицировать переменные окружения.
Пример:
#include<stdlib.h>
int setenv(const char * NAME, const char * VALUE, int OV);
int putenv(const char * NAME);
int unsetenv(const char * NAME);
Setenv – добавляет новую переменную окружения или заменяет уже существующую переменную окружения заданную первым аргументом, присваивает ей значение заданное вторым аргументом, третий аргумент – это флаг, показывающий нужно ли перезаписывать переменную, если она уже существует (если 0,то не перезаписывается, в противном случае изменяется). При успешном завершении возвращает 0 и -1 при ошибке.
Putenv - добавляет новую переменную окружения или заменяет уже существующую переменную окружения. Использует аргумент который должен иметь вид ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. При успешном завершении возвращает 0 и -1 при ошибке.
Unsetenv – удаляет переменную заданную в начале аргумента из окружения. При успешном завершении возвращает 0 и -1 при ошибке.