- •Введение
- •Глава 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
Стандартные дескрипторы
Согласно принятым соглашениям, первые три файловых дескриптора передаются процессу уже открытыми. Дескриптор с номером 0 соответствует устройству ввода, дескриптор с номером 1 – устройству стандартного вывода, а с номером 2 – устройству стандартного вывода сообщений об ошибках. Эти три дескриптора обычно используются для управления терминалом. В текстах программ вместо номеров удобнее использовать константы STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO.
Утилиты Unix должны выполнять чтение входных данных из STDIN_FILENO и записывать результаты в STDOUT_FILENO, благодаря этому командная оболочка может объединять их в конвейеры. Для выдачи важных сообщений следует использовать устройство STDERR_FILENO, поскольку любой вывод в STDOUT_FILENO может быть перенаправлен в файл или передан дальше по конвейеру другой утилите, что является обычной практикой при работе с командной оболочкой.
Любой из стандартных дескрипторов может соответствовать обычному файлу, каналу, именованному каналу, устройству и даже сокету. Это отличный способ обеспечить независимость от типа устройства ввода и/или вывода, однако это возможно далеко не всегда. Например, экранный редактор наверняка не сможет работать, если устройство стандартного вывода не является терминальным устройством.
К моменту запуска процесса, три стандартных дескриптора уже открыты и готовы к использованию в вызовах read и write. Процесс может открывать другие дескрипторы, которые используются для работы с файлами, каналами и т.п. Родительский процесс может завещать потомку не только эти три стандартных дескриптора, но и те, что открыл сам.
Файловые дескрипторы не используются в механизмах взаимодействия между процессами, таких как очереди сообщений, к которым неприменимы вызовы read и write. Существует не так много способов открыть новый файловый дескриптор:
open - используется в большинстве случаев, когда можно указать путь к файлу, включая обычные файлы, специальные файлы и именованные каналы;
pipe - создает и открывает неименованный канал;
socket, accept и connect - используются для создания сетевых соединений.
Дескриптор файла - это индекс в таблице дескрипторов, которая имеется у каждого процесса. Каждый элемент этой таблицы содержит указатель на запись в единой для всей системы таблице описаний открытых файлов. Запись в таблице файлов в свою очередь ссылается на данные в файле. Разные файловые дескрипторы, даже принадлежащие разным процессам, могут ссылаться на одну и ту же запись в таблице файлов.
Каждый вызов open или pipe создает новую запись в таблице и новый дескриптор.
Для каждого файла определяются 9 бит прав доступа: права на чтение, запись и исполнение для владельца файла, группы и всех остальных. Можно наблюдать их в выводе команды ls: -rwxr-xr-x 1 marc users 29808 Aug 4 13:45 hello
Большинство представляют их себе как набор из 9 бит, следующих друг за другом в определенном порядке (владелец, группа, остальные), но это совершенно не обязательно. Так стандартом POSIX1088 вместо восьмеричных чисел для описания прав доступа были рекомендованы к применению специальные идентификаторы. Принцип их именования следует шаблону S_Ipwww, где p определяет режим доступа (R, W или X), а www – кому выдается право на этот режим доступа (USR, GRP или OTH). Например, для предыдущего файла вместо восьмеричного числа 755 можно записать:
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
Существуют отдельные идентификаторы для USR, GRP или OTH, которые описывают полные права доступа. Именование этих идентификаторов следует форме S_IRWXw. Здесь символ w определяет, кому выдается право доступа к файлу – U, G или O.Таким образом, предыдущий пример может быть записан в следующем виде: S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
Использование идентификаторов дает разработчикам ОС свободу выбора порядка следования бит, описывающих права доступа к файлу.