- •Введение
- •Глава 1. Фундаментальные концепции unix Систем
- •Программы, процессы и потоки
- •Сигналы
- •Идентификаторы процессов, группы процессов и сеансы
- •Система прав
- •Другие атрибуты процесса
- •Межпроцессное взаимодействие
- •Использование системных вызовов
- •Краткие описания функций и обработка ошибок
- •Контрольные вопросы
- •Литература
- •Глава 2. Базовые операции ввода-вывода
- •Файловые операции ввода - вывода
- •Стандартные дескрипторы
- •Системные вызовы open и creat
- •Системный вызов umask
- •Системный вызов unlink
- •Текущая позиция в файле
- •Системный вызов write
- •2.8. Системный вызов read
- •2.9. Системный вызов close
- •2.10. Системный вызов lseek
- •2.11. Системные вызовы pread и pwrite
- •2.12. Системные вызовы truncate и ftruncate
- •Контрольные вопросы
- •Литература
- •Глава 3. Дополнительные операции файлового ввода_вывода
- •Низкоуровневый доступ к файловой системе
- •Жесткие и символические ссылки
- •Системный вызов getcwd
- •Отображение метаданных файла
- •Системные вызовы getpwuid, getgrgid и getlogin
- •Каталоги
- •Системные вызовы chdir и fchdir
- •Системные вызовы mkdir и rmdir
- •Контрольные вопросы
- •Литература
- •Глава 4. Процессы и потоки
- •4.1. Среда окружения
- •Системный вызов exec
- •Системный вызов fork
- •Завершение процесса и системные вызовы exit
- •Системные вызовы wait, waitpid и waitid
- •Получение и изменение идентификаторов пользователя и группы
- •Получение и изменение приоритета
- •Контрольные вопросы
- •Литература
- •Глава 5. Механизмы межпроцессного взаимодействия
- •5.1. Каналы
- •5.2. Системные вызовы dup и dup2
- •5.3. Двунаправленное взаимодействие с использованием однонаправленных каналов
- •Контрольные вопросы
- •Литература
- •Глава 6.Механизмы взаимодействия процессов
- •Именованные каналы (fifo)
- •Системные вызовы для работы с очередями сообщений posix
- •Семафоры
- •Системные вызовы для работы с общей памятью posix
- •Контрольные вопросы
- •Литература
- •Глава 7.Сетевое взаимодействие и сокеты
- •Основные системные вызовы для работы с сокетами, образующими логические соединения
- •Обслуживание нескольких клиентов
- •Адресация сокетов
- •In_port_t sin_port; /* номер порта (uint16_t) */
- •In_addr_t s_addr; /* адрес iPv4 (uint32_t) */
- •Домен адресов af_inet6
- •In_port_t sin6_port; /* номер порта (uint16_t) */
- •Доменная система именования
- •Параметры сокетов
- •Контрольные вопросы
- •Литература
- •Глава 8.Сигналы и таймеры
- •Введение в сигналы
- •Жизненный цикл сигналов
- •Типы сигналов
- •Системный вызов sigaction
- •Контрольные вопросы
- •Литература
- •Заключение
- •Список литературы
- •Глава 2. Базовые операции ввода-вывода 14
- •Глава 3. Дополнительные операции файлового ввода_вывода 25
- •Глава 6. Механизмы взаимодействия процессов 58
Контрольные вопросы
Напишите свою реализацию стандартной команды df.
Напишите программу копирования дерева каталогов со всем его содержимым.
Почему отсутствует системный вызов lchmod?
Реализуйте системный вызов access в виде функции. Допускается использование любых системных вызовов, кроме самого системного вызова access.
Литература
Глас Г., Эйблс К. Unix для программистов и пользователей. / Г. Глас, К. Эйблс – СПб.: БХВ-Петербург, 2004. – 848 с.: ил.
Брюс М. 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