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

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

  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