- •Часть 4. Локальное взаимодействие процессов
- •Глава 16. Блокирование записей 89
- •12.2. Процессы, потоки и общий доступ к информации
- •12.3. Живучесть объектов ipc
- •12.4. Пространства имен
- •12.5. Действие команд fork, exec и exit на объекты ipc
- •12.6. Комментарии к примерам ipc
- •12.7. Выводы по главе 12
- •12.8. Упражнения по главе 12
- •Глава 13. Именованные и неименованные каналы
- •13.1. Введение
- •13.2. Приложение типа клиент-сервер
- •13.3. Программные каналы
- •13.4. Функции popen и pclose
- •13.5. Именованные каналы (fifo)
- •13.6. Некоторые свойства именованных и неименованных каналов
- •13.7. Один сервер, несколько клиентов
- •13.8. Последовательные и параллельные серверы
- •13.9. Ограничения программных каналов и fifo
- •13.10. Выводы по главе 13
- •13.11. Упражнения по главе 13
- •Глава 14. Программные потоки
- •14.1. Введение
- •14.2. Концепция потоков
- •14.3. Идентификация потоков
- •14.4. Создание потока
- •14.5. Завершение потока
- •Функции управления процессами и потоками
- •14.6. Установка атрибутов потока
- •14.7. Реентерабельность
- •Альтернативные версии функций, безопасные в многопоточной среде
- •14.8. Локальные данные потоков
- •14.9. Принудительное завершение потоков
- •Некоторые точки выхода, определенные стандартом Posix.1
- •14.10. Потоки и сигналы
- •14.11. Выводы по главе 14
- •14.12. Упражнения по главе 14 Глава 15. Средства синхронизации потоков
- •15.1. Введение
- •15.2. Взаимные исключения: установка и снятие блокировки
- •15.2.1. Схема производитель-потребитель
- •15.2.2. Блокирование и опрос
- •15.2.3. Предотвращение тупиковых ситуаций
- •15.3. Условные переменные
- •15.3.1. Ожидание и сигнализация
- •15.3.2. Исключение состояния гонок
- •15.4. Блокировки чтения-записи
- •15.5. Атрибуты средств синхронизации потоков
- •15.5.1. Атрибуты взаимных исключений
- •Поведение взаимных исключений различных типов
- •15.5.2. Атрибуты условных переменных
- •15.5.3. Атрибуты блокировок чтения-записи
- •15.6. Выводы по главе 15
- •15.7. Упражнения по главе 15
- •Глава 16. Блокирование записей
- •16.1. Введение
- •16.2. Блокирование записей и файлов
- •16.3. Блокирование записей с помощью fcntl по стандарту Posix
- •16.4. Рекомендательная блокировка
- •16.5. Обязательная блокировка
- •16.6. Приоритет чтения и записи Выводы по главе 16
- •Упражнения по главе 16 Глава 17. System V ipc
- •17.1. Введение
- •17.2. Ключи типа key_t и функция ftok
- •17.3. Структура ipc_perm
- •17.4. Создание и открытие каналов ipc
- •17.5. Разрешения ipc
- •17.6. Программы ipcs и ipcrm
- •17.7. Ограничения ядра
- •17.8. Выводы по главе 17
- •17.9. Упражнения по главе 17
- •Глава 18. Очереди сообщений System V
- •18.1. Введение
- •18.2. Функция msgget
- •18.3. Функция msgsnd
- •18.4. Функция msgrcv
- •18.5. Функция msgctl
- •18.6. Пример программы клиент-сервер
- •18.7. Мультиплексирование сообщений
- •18.7.1. Пример: одна очередь на приложение
- •18.7.2. Пример: одна очередь для каждого клиента
- •18.8. Ограничения, накладываемые на очереди сообщений
- •18.9. Выводы по главе 18
- •18.10. Упражнения по главе 18
- •Глава 19. Семафоры System V
- •19.1. Введение
- •19.2. Функция semget
- •19.3. Функция semop
- •19.4. Функция semctl
- •19. . Ограничения семафоров System V
- •19. . Выводы по главе 19
- •19. . Упражнения по главе 19 Глава 20. Введение в разделяемую память
- •20.1. Введение
- •20.2. Функции mmap, munmap и msync
- •20.3. Увеличение счетчика в отображаемом в память файле
- •20.4. Неименованное отображение в память
- •20.5. Обращение к объектам, отображенным в память
- •20.6. Выводы по главе 20
- •20.7. Упражнения по главе 20
- •Глава 21. Разделяемая память System V
- •21.1. Введение
- •21.2. Функция shmget
- •21.3. Функция shmat
- •21.4. Функция shmdt
- •21.5. Функция shmctl
- •21.6. Ограничения, накладываемые на разделяемую память
- •21.7. Выводы по главе 21
- •21.8. Упражнения по главе 21
17.5. Разрешения ipc
При создании нового объекта IPC с помощью одной из функций getXXX, вызванной с флагомIPC_CREAT, в структуруipc_permзаносится следующая информация:
Часть битов аргумента oflagзадают значение поляmodeструктурыipc_perm. В табл.16.3приведены биты разрешений для трех типов IPC (запись >>3 означает сдвиг вправо на три бита).
Поля cuidиcgidполучают значения, равные действующим идентификаторам пользователя и группы вызывающего процесса. Эти два поля называются идентификаторами создателя.
Поля uidиgidструктурыipc_permтакже устанавливаются равными действующим идентификаторам вызывающего процесса. Эти два поля называются идентификаторами владельца.
Таблица 16.3
Значения modeдля разрешений чтения-записи IPC
|
Число (восьме-ричное) |
Очередь сообщений |
Семафор |
Разделяемая память |
Описание |
|
0400 |
MSG_R |
SEM_R |
SHM_R |
Создатель (владелец) – чтение |
|
0200 |
MSG_W |
SEM_A |
SHM_W |
Создатель (владелец) – запись |
|
0040 |
MSG_R>>3 |
SEM_R>>3 |
SHM_R>>3 |
Группа – чтение |
|
0020 |
MSG_W>>3 |
SEM_A>>3 |
SHM_W>>3 |
Группа – запись |
|
0004 |
MSG_R>>6 |
SEM_R>>6 |
SHM_R>>6 |
Прочие – чтение |
|
0002 |
MSG_W>>6 |
SEM_A>>6 |
SHM_W>>6 |
Прочие – запись |
Идентификатор создателя изменяться не может, тогда как идентификатор владельца может быть изменен процессом с помощью вызова функции ctlXXXдля данного механизма IPC с командойIPC_SET. Три функцииctlXXXпозволяют процессу изменять биты разрешений доступа (полеmode) объекта IPC.
Все три функции getXXXне используют стандартную маску создания файла Unix (раздел 4.8). Разрешения чтения-записи для очереди сообщений, семафора и сегмента разделяемой памяти устанавливаются в точности равными разрешениям, заданным в аргументеoflagсоответствующей функции.
Когда какой-либо процесс предпринимает попытку доступа к объекту IPC, производится двухэтапная проверка: первый раз при открытии объекта (функции getXXX) и затем каждый раз при обращении к объекту IPC:
При установке доступа к существующему объекту IPC с помощью одной из функций getXXXпроизводится первичная проверка аргументаoflagпроцесса, вызвавшего функцию. Этот аргумент не должен содержать биты доступа, не установленные в полеmodeструктурыipc_perm. Например, процесс-сервер может установить значение членаmodeдля своей очереди входящих сообщений, сбросив биты чтения для группы и прочих пользователей. Любой процесс, попытавшийся указать эти биты в аргументеoflag функции msgget, получит ошибку. Надо отметить, что от этой проверки, производимой функциямиgetXXX, мало пользы. Она подразумевает наличие у вызывающего процесса информации о том, к какой группе пользователей он принадлежит: он может являться владельцем объекта, может принадлежать к той же группе или к прочим пользователям. Если создающий процесс сбросит некоторые биты разрешений, а вызывающий процесс попытается их установить, функцияgetXXXвернет ошибку. Любой процесс может полностью пропустить эту проверку, указав аргументoflag, равный 0, если заранее известно о существовании объекта IPC.
При любой операции с объектами IPC производится проверка разрешений для процесса, запрашивающего эту операцию. Например, каждый раз, когда процесс пытается поместить сообщение в очередь с помощью команды msgsnd, производятся нижеследующие проверки (при получении доступа последующие этапы пропускаются):
привилегированному пользователю доступ предоставляется всегда;
если действующий идентификатор пользователя совпадает со значением uidилиcuidобъекта IPC и установлен соответствующий бит разрешения доступа в полеmodeобъекта IPC, доступ будет разрешен. Под соответствующим битом разрешения доступа подразумевается бит, разрешающий чтение, если вызывающий процесс запрашивает операцию чтения для данного объекта IPC (например, получение сообщения из очереди), или бит, разрешающий запись, если процесс хочет осуществить ее;
если действующий идентификатор группы совпадает со значением gidилиcgidобъекта IPC и установлен соответствующий бит разрешения доступа в полеmodeобъекта IPC, доступ будет разрешен;
если доступ не был разрешен на предыдущих этапах, проверяется наличие соответствующих установленных битов доступа для прочих пользователей.
