- •Часть 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
12.4. Пространства имен
Если два неродственных процесса используют какой-либо вид IPC для обмена информацией, объект IPC должен иметь имя или идентификатор, чтобы один из процессов (называемый обычно сервером – server) мог создать этот объект, а другой процесс (обычно один или несколько клиентов – client) мог обратиться к этому конкретному объекту.
Программные каналы (pipes) именами не обладают (и поэтому не могут использоваться для взаимодействия между неродственными процессами), но каналам FIFO сопоставляются имена в файловой системе, являющиеся их идентификаторами (поэтому каналы FIFO могут использоваться для взаимодействия неродственных процессов). Для других типов IPC, рассматриваемых в последующих главах, используются дополнительные соглашения об именовании (naming conventions). Множество возможных имен для определенного типа IPC называется его пространством имен (name space). Пространство имен – важный термин, поскольку для всех видов IPC, за исключением простых каналов, именем определяется способ связи клиента и сервера для обмена сообщениями.
В табл. 12.2сведены соглашения об именовании для различных видов IPC.
Таблица 12.2
Пространства имен для объектов IPC различных типов
|
Тип IPC |
Пространство имен для создания или открытия |
Идентификатор после открытия |
|
Программный канал (pipe) |
(Без имени) |
Дескриптор |
|
Именованный канал (FIFO) |
Имя файла |
Дескриптор |
|
Взаимное исключение |
(Без имени) |
Переменная типа pthread_mutex_t |
|
Условная переменная |
(Без имени) |
Переменная типа pthread_cond_t |
|
Блокировка чтения-записи |
(Без имени) |
Переменная типа pthread_rwlock_t |
|
Блокировка записей fcntl |
Имя файла |
Дескриптор |
|
Очередь сообщений System V |
Ключ key_t |
Идентификатор IPC System V |
|
Семафор System V |
Ключ key_t |
Идентификатор IPC System V |
|
Память с общим доступом System V |
Ключ key_t |
Идентификатор IPC System V |
|
Гнездо TCP (TCP socket) |
IP-адрес и порт TCP |
Дескриптор |
|
Гнездо UDP (UDP socket) |
IP-адрес и порт UDP |
Дескриптор |
|
Гнездо домена Unix (Unix domain socket) |
Имя файла |
Дескриптор |
12.5. Действие команд fork, exec и exit на объекты ipc
Нам нужно достичь понимания действия функций fork,execи_exitна различные формы IPC, которые мы обсуждаем (последняя из перечисленных функций вызывается функциейexit). Информация по этому вопросу сведена в табл.12.3.
Таблица 12.3
Действие функций fork,execи_exitна объекты IPC
|
Тип IPC |
fork |
exec |
_exit |
|
Неименован-ные и именованные каналы |
Порожденный процесс получает копии всех дескрипторов родительского процесса |
Все открытые дескрипторы остаются открытыми, если для них не установлен бит FD_CLOEXEC |
Все открытые дескрипторы закрываются, данные из программного канала и FIFO удаляются после последнего закрытия |
|
Взаимные исключения, условные переменные и блокировки чтения-записи |
Общий доступ, если используется разделяемая память с атрибутом разделения между процессами |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
Исчезает, если не хранится в разделяемой памяти, которая остается открытой и имеет атрибут разделения |
|
Блокировка записей fcntl |
Блокировки в родительском процессе не наследуются порожденным процессом |
Блокировки не изменяются до тех пор, пока не закроется дескриптор |
Все несброшенные блокировки, установленные процессом, снимаются |
|
Очереди сообщений System V |
Не действует |
Не действует |
Не действует |
|
Семафоры System V |
Все значения semadjв порожденном процессе устанавливаются в 0 |
Все значения semadjпередаются новой программе |
Все значения semadjдобавляются к значению соответствующего семафора |
|
Разделяемая память System V |
Присоединенные сегменты разделяемой памяти остаются присоединенными в порожденном процессе |
Присоединенные сегменты разделяемой памяти отсоединяются |
Присоединенные сегменты разделяемой памяти отсоединяются |
|
Отображение памяти |
Отображения памяти родительского процесса сохраняются в порожденном |
Отображения памяти сбрасываются |
Отображения памяти сбрасываются |
