
- •Введение
- •Глава 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
Домен адресов af_inet6
Если
можно было использовать все 32 бита, то
IPv4
мог бы адресовать 4,3 миллиарда сетевых
узлов. На сегодняшний день этого
количества пока достаточно. Однако
из-за способа назначения адресов IPv4
это количество на самом деле много
меньше. В результате была предпринята
попытка разработать версию 6 протокола
IP
- IPv6,
который наряду с другими улучшениями
увеличил размер адреса с 4 до 16 байт, что
позволяет адресовать до
узлов сети. АдресаIPv6
записываются как 8 групп по 2 байта в
каждой, например:
FEDC:BA98:7654:3210:FEDC:BA98:7654:3210.
При создании сокетов из домена адресов
AF_INET6
нужно использовать структуру sockaddr_in6,
которая включает немного больше полей,
чем ее предшественница sockaddr_in:
struct sockaddr_in6 - структура адресов из домена AF_INET6
#include <netinet/in.h>
struct sockaddr_in6 {
sa_family_t sin6_family; /* AF_INET6 */
In_port_t sin6_port; /* номер порта (uint16_t) */
uint32_t sin6_flowinfo; /* класс трафика и информация о потоке */
struct in6_addr sin6_addr; /* адрес IPv4 */
uint32_t sin6_scope_id; /* набор интерфейсов в области видимости */
};
struct in6_addr {
uint8_t s6_addr[16]; /* адрес IPv6 */
};
В этой структуре два новых поля. Это поле sin6_flowinfo, которое предназначено для хранения метки потока и приоритета, а sin6_scope_id идентифицирует набор интерфейсов для использования с определенными адресами. Если нужно использовать эту структуру в своих приложениях, то инициализируйте поле sin6_scope_id значением 0.
Доменная система именования
Очень редко приходится в адресной строке обозревателя Интернета набирать непосредственно IP – адрес. Практически всегда набирают имя сервера, например: www.nsuem.ru. Имена узлов сети транслируются в IP – адреса благодаря наличию всемирной распределенной базы данных имен, которая называется DNS. Для доступа к DNS из приложений в OC UNIX существует ряд специализированных функций. В обобщенном виде адрес записывается как: scheme://hostname/path, где scheme определяет способ доступа к ресурсу (например, HTTP), hostname - имя сетевого узла в том виде, в каком оно представлено в базе DNS, а path - путь в пределах файловой системы сетевого узла.
В примерах мы использовали сокеты для того, чтобы установить соединение с сетевым узлом, все дальнейшее взаимодействие осуществлялось в соответствии со схемой. Как передается часть адреса path, зависит от используемой схемы. Сами сокеты никак не беспокоятся ни по поводу пути к ресурсу, ни по поводу схемы.
Параметры сокетов
Все параметры сокетов настраиваются в отдельном системном вызове:
setsockopt – устанавливает параметры сокета
#include <sys/socket.h>
int setsockopt (
int socket_fd, /* файловый дескриптор сокета */
int level, /* уровень протокола */
int option, /* устанавливаемый параметр */
const void *value, / * значение параметра */
socklen_t value_len /* длина значения */
);
/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки - в errno) */
Второй аргумент level, идентифицирует уровень протокола, которому предназначается указанный параметр. Для манипуляции параметрами на уровне сокета задается уровень SOL_SOCKET, и вы будете использовать этот уровень значительно чаще других. Определено еще 6 уровней протоколов: IPPROTO_IP (протокол IP); IPPROTO_IPV6 (протокол IP версии 6); IPPROTO_ICMP (протокол управляющих сообщений – ICMP); IPPROTO_RAW (низкоуровневый сетевой протокол); IPPROTO_TCP (протокол управления передачей – TCP); IPPROTO_UDP (протокол обмена дейтаграммами – UDP).