Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать

Контрольные вопросы

  1. Напишите свою реализацию стандартной команды df.

  2. Напишите программу копирования дерева каталогов со всем его содержимым.

  3. Почему отсутствует системный вызов lchmod?

  4. Реализуйте системный вызов access в виде функции. Допускается использование любых системных вызовов, кроме самого системного вызова access.

Литература

  1. Глас Г., Эйблс К. Unix для программистов и пользователей. / Г. Глас, К. Эйблс – СПб.: БХВ-Петербург, 2004. – 848 с.: ил.

  2. Брюс М. Unix/Linux: Теория и практика программирования. / М.Брюс - Издательство "Кудиц-Образ", 2004. -576 с.

Глава 4. Процессы и потоки

В этой главе будут рассмотрены вопросы запуска программ и процессов с помощью exec, fork, wait и родственных им системных вызовов.

4.1. Среда окружения

При запуске любая программа Unix получает от вызывающего процесса два набора данных: аргументы командной строки и переменные среды окружения. В программах на языке С оба набора представлены в виде массивов указателей, причем последний указатель в каждом из массивов имеет значение NULL. Кроме того, программа получает счетчик, содержащий количество элементов в массиве аргументов. Исполнение программ на языках С и С++ начинается с функции main(), которая может быть определена одним из двух способов:

main - точка входа в программу на языке С

int main (

int argc, /* количество аргументов */

char * argv[ ] /* массив аргументов в виде строк */

);

int main (void)

Параметр argc содержит количество аргументов командной строки без учета последнего, пустого указателя, который завершает массив argv. Если программа не предусматривает прием аргументов, то argc и argv могут быть опущены и использована вторая форма объявления. Кроме того, любая программа получает в свое распоряжение глобальную переменную environ. Она указывает на массив с переменными окружения, который также завершается пустым указателем:

environ - переменные окружения

extern char ** environ; /* массив переменных среды окружения */

Строки в массиве аргументов могут содержать любую комбинацию символов, но каждая строка обязательно завершается символом “\0”. Строки с переменными окружения имеют более строгую форму. Каждая из них записывается в виде: «имя=значение», и также завершается символом “\0”. Само собой разумеется, имя переменной окружения не может содержать символ «=». Самый простой способ – обратиться к массиву environ напрямую:

extern char ** environ;

int main (void)

{

int i;

for (i = 0; environ[i] != NULL; i++)

printf(“%s\n”, environ[i] );

exit(EXIT_SUCCESS);

}

В программах не требуется просматривать весь список, чаще всего необходимо получить значение какой-нибудь определенной переменной. Для этой цели используется стандартная функция getenv:

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

#include <stdlib.h>

char * getenv(

const char *var /* имя переменной */

);

/* Возвращает значение переменной или NULL, если таковая не найдена (значение переменной errno не определено) */

Функция getenv возвращает часть строки, которая стоит после символа «=», например, программа:

int main (void)

{

char *s;

s = getenv(“LOGNAME”);

if (s = NULL)

printf(“переменная не найдена\n);

else

printf(“значение переменной: \”%s\”\n”, s);

exit(EXIT_SUCCESS);

}

Программа вывела значение переменной: marc