Предисловие
 Введение
 Изменения со времени первого издания
 Кому адресована эта книга? 
 Исходный код и опечатки 
 Благодарности 
 Выходные сведения 
 От издательства 
 
 Часть 1. Введение в IPC Unix 
 
 Глава 1. Обзор средств взаимодействия процессов Unix 
 1.1. Введение
 1.2. Процессы, потоки и общий доступ к информации 
 Потоки 
 1.3. Живучесть объектов IPC
 1.4. Пространства имен
 1.5. Действие команд fork, exec и exit на объекты IPC
 1.6. Обработка ошибок: функции-обертки 
 Значение errno 
 1.7. Стандарты Unix 
 Posix 
 The Open Group 
 Версии Unix и переносимость 
 1.8. Комментарий к примерам IPC
 1.9. Резюме
 Упражнения
 
 Глава 2. Posix IPC 
 2.1. Введение
 2.2. Имена IPC 
 Функция px_ipc_name 
 2.3. Создание и открытие каналов IPC
 2.4. Разрешения IPC
 2.5. Резюме
 Упражнения
 
 Глава 3. System V IPC 
 3.1. Введение
 3.2. Ключи типа key_t и функция ftok 
 Пример 
 3.3. Структура ipc_perm
 3.4. Создание и открытие каналов IPC
 3.5. Разрешения IPC
 3.6. Повторное использование идентификаторов
 3.7. Программы ipcs и ipcrm
 3.8. Ограничения ядра
 3.9. Резюме
 Упражнения
 
 Часть 2. Обмен сообщениями 
 
 Глава 4. Именованные и неименованные каналы 
 4.1. Введение 
 4.2. Приложение типа клиент-сервер
 4.3. Программные каналы Пример 4.4. Двусторонние каналы 4.5. Функции popen и pclose 
 Пример 
 4.6. Именованные каналы (FIFO) 
 Пример 
 Пример: неродственные клиент и сервер 
 4.7. Некоторые свойства именованных и неименованных каналов
 4.8. Один сервер, несколько клиентов 
 Открытие файла и отправка его в FIFO клиента 
 Атомарность записи в FIFO 
 FIFO и NFS 
 4.9. Последовательные и параллельные серверы 
 Атака типа «отказ в обслуживании» 
 4.10. Потоки и сообщения
 4.11. Ограничения программных каналов и FIFO
 4.12. Резюме
 Упражнения
 
 Глава 5. Очереди сообщений Posix 
 5.1. Введение
 5.2. Функции mq_open, mq_close, mq_unlink 
 Пример: программа mqcreate1 
 Пример: программа mqunlink 
 5.3. Функции mq_getattr и mq_setattr 
 Пример: программа mqgetattr 
 Пример: программа mqcreate 
 5.4. Функции mq_send и mq_receive 
 Пример: программа mqsend 
 Пример: программа mqreceive 
 5.5. Ограничения очередей сообщений 
 Пример: программа mqsysconf 
 5.6. Функция mq_notify 
 Пример: простая программа с уведомлением 
 Сигналы Posix: функции типа Async-Signal-Safe 
 Пример: уведомление сигналом 
 Пример: уведомление сигналом с отключением блокировки 
 Пример: уведомление с использованием sigwait вместо обработчика 
 Пример: очереди сообщений Posix и функция select 
 Пример: запуск нового потока 
 5.7. Сигналы реального времени Posix 
 Пример 
 Функция signal_rt 
 5.8. Реализация с использованием отображения в память 
 Функция mq_close 
 Функция mq_unlink 
 Функция mq_getattr 
 Функция mq_setattr 
 Функция mq_notify 
 Функция mq_send 
 Функция mq_receive 
 5.9. Резюме
 Упражнения
 
 Глава 6. Очереди сообщений System V 
 6.1. Введение
 6.2. Функция msgget
 6.3. Функция msgsnd
 6.4. Функция msgrcv
 6.5. Функция msgctl 
 Пример 
 6.6. Простые примеры 
 Программа msgcreate 
 Программа msgsnd 
 Программа msgrcv 
 Программа msgrmid 
 Примеры 
 Программа msgrcvid 
 6.7. Пример программы клиент-сервер
 6.8. Мультиплексирование сообщений 
 Пример: одна очередь на приложение 
 Пример: одна очередь для каждого клиента 
 6.9. Использование select и poll с очередями сообщений
 6.10. Ограничения, накладываемые на очереди сообщений 
 Пример 
 6.11. Резюме
 Упражнения
 
 Часть 3. Синхронизация 
 
 Глава 7. Взаимные исключения и условные переменные 
 7.1. Введение
 7.2. Взаимные исключения: установка и снятие блокировки
 7.3. Схема производитель-потребитель
 7.4. Блокировка и ожидание
 7.5 Условные переменные: ожидание и сигнализация 
 Исключение конфликтов блокировок 
 7.6. Условные переменные: время ожидания 
 и широковещательная передача 
 7.7. Атрибуты взаимных исключений и условных переменных 
 Завершение процесса, заблокировавшего ресурс 
 7.8. Резюме
 Упражнения
 
 Глава 8. Блокировки чтения-записи 
 8.1. Введение
 8.2. Получение и сброс блокировки чтения-записи
 8.3. Атрибуты блокировки чтения-записи
 8.4. Реализация с использованием взаимных исключений и условных переменных 
 Тип данных pthread_rwlock_t 
 Функция pthread_rwlock_init 
 Функция pthread_rwlock_destroy 
 Функция pthread_rwlock_rdlock 
 Функция pthread_rwlock_tryrdlock 
 Функция pthread_rwlock_wrlock 
 Функция pthread_rwlock_trywrlock 
 Функция pthread_rwlock_unlock 
 8.5. Отмена выполнения потоков 
 Пример 
 Функция thread1 
 Функция thread2 
 8.6. Резюме
 Упражнения
 
 Глава 9. Блокирование записей 
 9.1. Введение
 9.2. Блокирование записей и файлов 
 История 
 9.3. Блокирование записей с помощью fcntl по стандарту Posix 
 Пример 
 Пример: упрощение с помощью макросов 
 9.4. Рекомендательная блокировка 
 Пример: несотрудничающие процессы 
 9.5. Обязательная блокировка 
 Пример 
 9.6. Приоритет чтения и записи 
 Пример: блокировка на чтение при наличии в очереди 
 блокировки на запись 
 Пример: имеют ли приоритет запросы на запись перед 
 запросами на чтение? 
 9.7. Запуск единственного экземпляра демона
 9.8. Блокирование файлов
 9.9. Блокирование в NFS
 9.10. Резюме
 Упражнения
 
 Глава 10. Семафоры Posix 
 10.1. Введение
 10.2. Функции sem_open, sem_close и sem_unlink
 10.3. Функции sem_wait и sem_trywait
 10.4. Функции sem_post и sem_getvalue
 10.5. Простые примеры 
 Программа semcreate 
 Программа semunlink 
 Программа semgetvalue 
 Программа semwait 
 Программа sempost 
 Примеры 
 10.6. Задача производителей и потребителей 
 Зависание 
 10.7. Блокирование файлов
 10.8. Функции sem_init и sem_destroy 
 Пример 
 10.9. Несколько производителей, один потребитель
 10.10. Несколько производителей, несколько потребителей
 10.11. Несколько буферов
 10.12. Использование семафоров несколькими процессами
 10.13. Ограничения на семафоры 
 Пример: программа semsysconf 
 10.14. Реализация с использованием FIFO 
 Функция sem_open 
 Функция sem_close 
 Функция sem_unlink 
 Функция sem_post 
 Функция sem_wait 
 10.15. Реализация с помощью отображения в память 
 Функция sem_open 
 Функция sem_close 
 Функция sem_unlink 
 Функция sem_post 
 Функция sem_wait 
 Функция sem_trywait 
 Функция sem_getvalue 
 10.16. Реализация с использованием семафоров System V 
 Функция sem_open 
 Функция sem_close 
 Функция sem_unlink 
 Функция sem_post 
 Функция sem_wait 
 Функция sem_trywait 
 Функция sem_getvalue 
 10.17. Резюме 
 Упражнения
 
 Глава 11. Семафоры System V 
 11.1. Введение
 11.2. Функция semget 
 Инициализация значения семафора 
 11.3. Функция semop
 11.4. Функция semctl
 11.5. Простые программы 
 Программа semcreate 
 Программа semrmid 
 Программа semsetvalues 
 Программа semgetvalues 
 Программа semops 
 Примеры 
 11.6. Блокирование файлов
 11.7. Ограничения семафоров System V 
 Пример 
 11.8. Резюме
 Упражнения
 
 Часть 4. Разделяемая память 
 
 Глава 12. Введение в разделяемую память 
 12.1. Введение
 12.2. Функции mmap, munmap и msync 
 Почему вообще используется отображение в память? 
 12.3. Увеличение счетчика в отображаемом в память файле
 12.4. Неименованное отображение в память в 4.4BSD
 12.5. Отображение в память в SVR4 с помощью /dev/zero
 12.6. Обращение к объектам, отображенным в память
 12.7. Резюме
 Упражнения
 
 Глава 13. Разделяемая память Posix 
 13.1. Введение
 13.2. Функции shm_open и shm_unlink
 13.3. Функции ftruncate и fstat 
 13.4. Простые программы 
 Программа shmcreate 
 Программа shmunlink 
 Программа shmwrite 
 Программа shmread 
 Примеры 
 Пример 
 13.5. Увеличение общего счетчика
 13.6. Отправка сообщений на сервер
 13.7. Резюме 
 Упражнения
 
 Глава 14. Разделяемая память System V 
 14.1. Введение
 14.2. Функция shmget
 14.3. Функция shmat
 14.4. Функция shmdt
 14.5. Функция shmctl
 14.6. Простые программы 
 Программа shmget 
 Программа shmrmid 
 Программа shmwrite 
 Программа shmread 
 Примеры 
 14.7. Ограничения, накладываемые на разделяемую память 
 Пример 
 14.8. Резюме
 Упражнение
 
 Часть 5. Удаленный вызов процедур 
 
 Глава 15. Двери 
 15.1. Введение 
 Пример 
 15.2. Функция door_call 
 15.3. Функция door_create
 15.4. Функция door_return 
 15.5. Функция door_cred 
 15.6. Функция door_info 
 15.7. Примеры 
 Функция door_info 
 Буфер результатов слишком мал 
 Функция door_cred и информация о клиенте 
 Автоматическое управление потоками сервера 
 Автоматическое управление потоками сервера: несколько процедур 
 Атрибут DOOR_UNREF для серверов 
 15.8. Передача дескрипторов 
 Пример 
 15.9. Функция door_server_create
 15.10. Функции door_bind, door_unbind и door_revoke
 15.11. Досрочное завершение клиента или сервера 
 Досрочное завершение сервера 
 Непрерываемость системного вызова door_call 
 Идемпотентные и неидемпотентные процедуры 
 Досрочное завершение клиента 
 15.12. Резюме
 Упражнения
 
 Глава 16. Пакет Sun RPC 
 16.1. Введение 
 Пример 
 История 
 16.2. Многопоточность
 16.3. Привязка сервера 
 Inetd и серверы RPC 
 16.4. Аутентификация
 16.5. Тайм-аут и повторная передача 
 Управление соединением по TCP 
 Идентификатор транзакций 
 Кэш повторных ответов 
 16.6. Семантика вызовов
 16.7. Досрочное завершение сервера или клиента 
 Досрочное завершение сервера 
 Досрочное завершение клиента 
 16.8. XDR: представление внешних данных 
 Пример: использование XDR без RPC 
 Пример: вычисление размера буфера 
 Пример: необязательные данные 
 Пример: обработка связного списка 
 16.9. Форматы пакетов RPC
 16.10. Резюме Упражнения
 Эпилог 
 
 Приложение А. Измерение производительности
 А.1. Введение
 А.2. Результаты
 А.3. Измерение полосы пропускания: программы
 А.4. Измерение задержки передачи сообщений: программы
 А.5. Синхронизация потоков: программы 
 А.6. Синхронизация процессов: программы 
 
 Приложение Б. Основы многопоточного программирования
 Б.1. Введение
 Б.2. Основные функции для работы с потоками: создание и завершение 
 
 Приложение В. Вспомогательные исходные коды
 В.1. Заголовочный файл unpipc.h
 В.2. Заголовочный файл config.h 
 В.3. Стандартные функции вывода сообщений об ошибках 
 
 Приложение Г. Решения некоторых упражнений 
 Главы 1 - 16 
 
 Литература 
 Алфавитный указатель