Предисловие | 18 |
|
Введение | 18 |
Изменения со времени первого издания | 19 |
Кому адресована эта книга? | 20 |
Исходный код и опечатки | 20 |
Благодарности | 21 |
Выходные сведения | 21 |
От издательства | 22 |
|
ЧАСТЬ 1. ВВЕДЕНИЕ В IPC UNIX |
|
ГЛАВА 1. Обзор средств взаимодействия процессов Unix | 24 |
|
1.1. Введение | 24 |
1.2. Процессы, потоки и общий доступ к информации | 26 |
Потоки | 27 |
1.3. Живучесть объектов IPC | 27 |
1.4. Пространства имён | 29 |
1.5. Действие команд fork, exec и exit на объекты IPC | 31 |
1.6. Обработка ошибок; функции-обёртки | 32 |
Значение errno | 34 |
1.7. Стандарты Unix | 35 |
Posix | 35 |
The Open Group | 37 |
Версии Unix и переносимость | 37 |
1.8. Комментарий к примерам IPC | 38 |
1.9. Резюме | 38 |
Упражнения | 40 |
|
ГЛАВА 2. Posix IPC | 41 |
|
2.1. Введение | 41 |
2.2. Имена IPC | 41 |
Функция px_ipc_name | 43 |
2.3. Создание и открытие каналов IPC | 44 |
2.4. Разрешения IPC | 47 |
2.5. Резюме | 48 |
Упражнения | 48 |
|
ГЛАВА 3. System V IPC | 49 |
|
3.1. Введение | 49 |
3.2. Ключи типа key_t и функция ftok | 49 |
Пример | 50 |
3.3. Структура ipc_perm | 51 |
3.4. Создание и открытие каналов IPC | 52 |
3.5. Разрешения IPC | 54 |
3.6. Повторное использование идентификаторов | 56 |
3.7. Программы ipcs и ipcrm | 58 |
3.8. Ограничения ядра | 58 |
3.9. Резюме | 60 |
Упражнения | 61 |
|
ЧАСТЬ 2. ОБМЕН СООБЩЕНИЯМИ |
|
ГЛАВА 4. Именованные и неименованные каналы | 63 |
|
4.1. Введение | 63 |
4.2. Приложение типа клиент-сервер | 63 |
4.3. Программные каналы | 64 |
Пример | 67 |
4.4. Двусторонние каналы | 70 |
4.5. Функции popen и pclose | 72 |
Пример | 73 |
4.6. Именованные каналы (FIFO) | 74 |
Пример | 75 |
Пример: неродственные клиент и сервер | 77 |
4.7. Некоторые свойства именованных и неименованных каналов | 78 |
4.8. Один сервер, несколько клиентов | 81 |
Открытие файла и отправка его в FIFO клиента | 84 |
Атомарность записи в FIFO | 86 |
FIFO и NFS | 87 |
4.9. Последовательные и параллельные серверы | 87 |
Атака типа «отказ в обслуживании» | 88 |
4.10. Потоки и сообщения | 88 |
4.11. Ограничения программных каналов и FIFO | 93 |
4.12. Резюме | 95 |
Упражнения | 95 |
|
ГЛАВА 5. Очереди сообщений Posix | 97 |
|
5.1. Введение | 97 |
5.2. Функции mq_open, mq_close, mq_unlink | 98 |
Пример: программа mqcreate1 | 99 |
Пример: программа mqunlink | 101 |
5.3. Функции mq_getattr и mq_setattr | 101 |
Пример: программа mqgetattr | 102 |
Пример: программа mqcreate | 103 |
5.4. Функции mq_send и mq_receive | 105 |
Пример: программа mqsend | 107 |
Пример: программа mqreceive | 107 |
5.5. Ограничения очередей сообщений | 109 |
Пример: программа mqsysconf | 109 |
5.6. Функция mq_notify | 109 |
Пример: простая программа с уведомлением | 111 |
Сигналы Posix: функции типа Async-Signal-Safe | 11З |
Пример: уведомление сигналом | 114 |
Пример: уведомление сигналом с отключением блокировки | 116 |
Пример: уведомление с использованием sigwait вместо обработчика | 118 |
Пример: очереди сообщений Posix и функция select | 119 |
Пример: запуск нового потока | 121 |
5.7. Сигналы реального времени Posix | 122 |
Пример | 125 |
Функция signal_rt | 128 |
5.8. Реализация с использованием отображения в память | 129 |
Функция mq_close | 140 |
Функция mq_unlink | 141 |
Функция mq_getattr | 141 |
Функция mq_setattr | 142 |
Функция mq_notify | 143 |
Функция mq_send | 144 |
Функция mq_receive | 148 |
5.9. Резюме | 150 |
Упражнения | 150 |
|
ГЛАВА 6. Очереди сообщений System V | 152 |
|
6.1. Введение | 152 |
6.2. Функция msgget | 153 |
6.3. Функция rnsgsnd | 153 |
6.4. Функция msgrcv | 155 |
6.5. Функция msgctl | 156 |
Пример | 156 |
6.6. Простые примеры | 157 |
Программа msgcreate | 158 |
Программа msgsnd | 158 |
Программа msgrcv | 159 |
Программа msgrmid | 160 |
Примеры | 160 |
Программа msgrcvid | 161 |
6.7. Пример программы клиент-сервер | 162 |
6.8. Мультиплексирование сообщений | 164 |
Пример: одна очередь на приложение | 165 |
Пример: одна очередь для каждого клиента | 169 |
6.9. Использование select и poll с очередями сообщений | 173 |
6.10. Ограничения, накладываемые на очереди сообщений | 174 |
Пример | 175 |
6.11. Резюме | 177 |
Упражнения | 177 |
|
ЧАСТЬ 3. СИНХРОНИЗАЦИЯ |
|
ГЛАВА 7. Взаимные исключения и условные |
переменные | 179 |
|
7.1. Введение | 179 |
7.2. Взаимные исключения: установка и снятие блокировки | 179 |
7.3. Схема производитель-потребитель | 181 |
7.4. Блокировка и ожидание | 186 |
7.5 Условные переменные: ожидание и сигнализация | 187 |
Исключение конфликтов блокировок | 191 |
7.6. Условные переменные; время ожидания |
и широковещательная передача | 191 |
7.7. Атрибуты взаимных исключений и условных переменных | 192 |
Завершение процесса, заблокировавшего ресурс | 194 |
7.8. Резюме | 195 |
Упражнения | 196 |
|
ГЛАВА 8. Блокировки чтения-записи | 197 |
|
8.1. Введение | 197 |
8.2. Получение и сброс блокировки чтения-записи | 198 |
8.3. Атрибуты блокировки чтения-записи | 198 |
8.4. Реализация с использованием взаимных исключений и условных |
переменных | 199 |
Тип данных pthread_rwlock_t | 200 |
Функция pthread_rwlock_init | 201 |
Функция pthread_rwlock_destroy | 201 |
Функция ptbread_rwlock rdlock | 203 |
Функция pthread_rwlock_tryrdlock | 204 |
Функция pthread_rwlock_wrlock | 204 |
Функция pthread_rwlock_trywrlock | 204 |
Функция pthread_rwlock_unlock | 206 |
8.5. Отмена выполнения потоков | 207 |
Пример | 208 |
Функция thread1 | 210 |
Функция thread2 | 210 |
8.6. Резюме | 212 |
Упражнения | 212 |
|
ГЛАВА 9. Блокирование записей | 213 |
|
9.1, Введение | 213 |
9.2. Блокирование записей и файлов | 217 |
История | 218 |
9.3. Блокирование записей с помощью fcntl по стандарту Posix | 219 |
Пример | 221 |
Пример: упрощение с помощью макросов | 222 |
9.4. Рекомендательная блокировка | 223 |
Пример: несотрудничающие процессы | 223 |
9.5. Обязательная блокировка | 224 |
Пример | 225 |
9.6. Приоритет чтения и записи | 227 |
Пример: блокировка на чтение при наличии в очереди блокировки |
на запись | 227 |
Пример: имеют ли приоритет запросы на запись перед запросами |
на чтение? | 230 |
9.7. Запуск единственного экземпляра демона | 233 |
9.8. Блокирование файлов | 234 |
9.9. Блокирование в NFS | 236 |
9.10. Резюме | 237 |
Упражнения | 237 |
|
ГЛАВА 10. Семафоры Posix | 239 |
|
10.1. Введение | 239 |
10.2. Функции sem_open, sem_close и sem_unlink | 245 |
10.3. Функции sem_wait и sem_trywait | 246 |
10.4. Функции sem_post и sem_getvalue | 246 |
10.5. Простые примеры | 247 |
Программа semcreate | 247 |
Программа semunlink | 248 |
Програлша semgetvalue | 249 |
Программа semwait | 249 |
Программа sempost | 250 |
Примеры | 250 |
10.6. Задача производителей и потребителей | 252 |
Зависание | 257 |
10.7. Блокирование файлов | 258 |
10.8. Функции sem_init и sem_destroy | 258 |
Пример | 260 |
10.9. Несколько производителей, один потребитель | 262 |
10.10. Несколько производителей, несколько потребителей | 265 |
10.11. Несколько буферов | 268 |
10.12. Использование семафоров несколькими процессами | 276 |
10.13. Ограничения на семафоры | 277 |
Пример: программа semsysconf | 277 |
10.14. Реализация с использованием FIFO | 278 |
Функция sem_open | 279 |
Функция sem_close | 281 |
Функция sem_unlink | 281 |
Функция sem_post | 282 |
Функция sem_wait | 282 |
10.15. Реализация с помощью отображения в память | 283 |
Функция sem_open | 284 |
Функция sem_close | 288 |
Функция sem_unlink | 288 |
Функция sem_post | 288 |
Функция sem_wait | 289 |
Функция sem_trywait | 290 |
Функция sem_getvalue | 291 |
10.16. Реализация с использованием семафоров System V | 291 |
Функция sem_open | 292 |
Функция sem_close | 295 |
Функция sem_unlink | 296 |
Функция sem_post | 296 |
Функция sem_wait | 296 |
Функция sem_trywait | 298 |
Функция sem_getvalue | 298 |
10.17. Резюме | 299 |
Упражнения | 299 |
|
ГЛАВА 11. Семафоры System V | 301 |
|
11.1. Введение | 301 |
11.2. Функция semget | 302 |
Инициализация значения семафора | 303 |
11.3. Функция semop | 305 |
11.4. Функция semctl | 307 |
11.5. Простые программы | 308 |
Программа semcreatc | 309 |
Программа semrmid | 309 |
Программа semsetvalues | 310 |
Программа semgetvalues | 311 |
Программа semops | 312 |
Примеры | 313 |
11.6. Блокирование файлов | 314 |
11.7. Ограничения семафоров System V | 316 |
Пример | 316 |
11.8. Резюме | 320 |
Упражнения | 320 |
|
ЧАСТЬ 4. РАЗДЕЛЯЕМАЯ ПАМЯТЬ |
|
ГЛАВА 12. Введение в разделяемую память | 322 |
|
12.1. Введение | 322 |
12.2. Функции mmap, munmap и msync | 327 |
Почему вообще используется отображение в память? | 329 |
12.3. Увеличение счётчика в отображаемом в память файле | 330 |
12.4. Неименованное отображение в память в 4.4BSD | 334 |
12.5. Отображение в память в SVR4 с помощью /dev/zero | 335 |
12.6. Обращение к объектам, отображённым в память | 336 |
12.7. Резюме | 341 |
Упражнения | 342 |
|
ГЛАВА 13. Разделяемая память Posix | 343 |
|
13.1. Введение | 343 |
13.2. Функции shm_ореп и shm_unlink | 343 |
13.3. Функции ftruncate и fstat | 345 |
13.4. Простые программы | 346 |
Программа shmcreate | 346 |
Программа shmunlink | 347 |
Программа shmwrite | 347 |
Программа shmread | 348 |
Примеры | 349 |
Пример | 349 |
13.5. Увеличение общего счётчика | 351 |
13.6. Отправка сообщений на сервер | 353 |
13.7. Резюме | 359 |
Упражнения | 360 |
|
ГЛАВА 14. Разделяемая память System V | 361 |
|
14.1. Введение | 361 |
14.2. Функция shmget | 361 |
14.3. Функция shmat | 362 |
14.4. Функция shmdt | 362 |
14.5. Функция shmctl | 363 |
14.6. Простые программы | 363 |
Программа shmget | 363 |
Программа shmrmid | 364 |
Программа shmwrite | 364 |
Программа shmread | 365 |
Примеры | 366 |
14.7. Ограничения, накладываемые на разделяемую память | 367 |
Пример | 367 |
14.8. Резюме | 368 |
Упражнение | 369 |
|
ЧАСТЬ 5. УДАЛЁННЫЙ ВЫЗОВ ПРОЦЕДУР |
|
ГЛАВА 15. Двери | 371 |
|
15.1. Введение | 371 |
Пример | 373 |
15.2. Функция door_call | 377 |
15.3. Функция door_create | 379 |
15.4. Функция door_return | 3S0 |
15.5. Функция door_cred | 381 |
15.6. Функция door_info | 381 |
15.7. Примеры | 382 |
Функция door_info | 382 |
Буфер результатов слишком мал | 383 |
Функция door_cred и информация о клиенте | 385 |
Автоматическое управление потоками сервера | 386 |
Автоматическое управление потоками сервера: несколько процедур | 388 |
Атрибут DOOR_UNREF для серверов | 391 |
15.8. Передача дескрипторов | 395 |
Пример | 396 |
15.9. Функция door_server_create | 400 |
15.10. Функции door_bind, door_unbind и door_revoke | 406 |
15.11. Досрочное завершение клиента или сервера | 406 |
Досрочное завершение сервера | 406 |
Непрерываемость системного вызова door_call | 407 |
Идемпотентные и неидемпотентные процедуры | 408 |
Досрочное завершение клиента | 411 |
15.12. Резюме | 413 |
Упражнения | 413 |
|
ГЛАВА 16. Пакет SunRPC | 415 |
|
16.1. Введение | 415 |
Пример | 416 |
История | 422 |
16.2. Многопоточность | 424 |
16.3. Привязка сервера | 427 |
Inetd и серверы RPC | 430 |
16.4. Аутентификация | 431 |
16.5. Тайм-аут и повторная передача | 434 |
Управление соединением по TCP | 437 |
Идентификатор транзакций | 438 |
Кэш повторных ответов | 438 |
16.6. Семантика вызовов | 439 |
16.7. Досрочное завершение сервера или клиента | 441 |
Досрочное завершение сервера | 441 |
Досрочное завершение клиента | 442 |
16.8. XDR: представление внешних данных | 443 |
Пример: использование XDR без RPC | 448 |
Пример: вычисление размера буфера | 454 |
Пример: необязательные данные | 455 |
Пример: обработка связного списка | 459 |
16.9. Форматы пакетов RPC | 461 |
16.10. Резюме | 466 |
Упражнения | 467 |
|
Эпилог | 469 |
|
ПРИЛОЖЕНИЕ А |
Измерение производительности | 473 |
|
А.1. Введение | 473 |
А.2. Результаты | 474 |
А.З, Измерение полосы пропускания: программы | 481 |
А.4. Измерение задержки передачи сообщений: программы | 494 |
А.5. Синхронизация потоков: программы | 500 |
А.6. Синхронизация процессов: программы | 510 |
|
ПРИЛОЖЕНИЕ Б |
Основы многопоточного программирования | 514 |
|
Б.1. Введение | 514 |
Б.2. Основные функции для работы с потоками: создание и завершение | 515 |
|
ПРИЛОЖЕНИЕ В |
Вспомогательные исходные коды | 518 |
|
В.1. Заголовочный файл unpipch | 518 |
В.2. Заголовочный файл config.h | 522 |
В.3. Стандартные функции вывода сообщений об ошибках | 523 |
|
ПРИЛОЖЕНИЕ Г |
Решения некоторых упражнений | 527 |
|
Глава 1 | 527 |
Глава 2 | 527 |
Глава 3 | 528 |
Глава 4 | 529 |
Глава 5 | 531 |
Глава 6 | 533 |
Глава 7 | 533 |
Глава 9 | 534 |
Глава 10 | 535 |
Глава 11 | 537 |
Глава 12 | 537 |
Глава 13 | 540 |
Глава 14 | 541 |
Глава 15 | 541 |
Глава 16 | 543 |
|
Литература | 546 |
|
Алфавитный указатель | 548 |