на главную | войти | регистрация | DMCA | контакты | справка |      
mobile | donate | ВЕСЕЛКА

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить
фантастика
космическая фантастика
фантастика ужасы
фэнтези
проза
  военная
  детская
  русская
детектив
  боевик
  детский
  иронический
  исторический
  политический
вестерн
приключения (исторический)
приключения (детская лит.)
детские рассказы
женские романы
религия
античная литература
Научная и не худ. литература
биография
бизнес
домашние животные
животные
искусство
история
компьютерная литература
лингвистика
математика
религия
сад-огород
спорт
техника
публицистика
философия
химия
close

UNIX: взаимодействие процессов

UNIX: взаимодействие процессов
Название: UNIX: взаимодействие процессов
Автор:Стивенс Уильям
Перевод:Солнышков Д.
Оценка: 5.0 из 5, проголосовало читателей - 1
Жанр: компьютерная литература
Описание:Книга написана известным экспертом по операционной системе UNIX и посвящена описанию одной из форм межпроцессного взаимодействия, IPC, с использованием которой создается большинство сложных программ. В ней описываются четыре возможности разделения решаемых задач между несколькими процессами или потоками одного процесса: передача сообщений, синхронизация, разделяемая память, удаленный вызов процедур.

Книга содержит большое количество иллюстрирующих примеров и может использоваться как учебник по IPC, и как справочник для опытных программистов.
Издание:6 г.
Содержание:

скрыть содержание

  1. Уильям Стивенс UNIX: взаимодействие процессов МАСТЕР-КЛАСС
  2. Предисловие
  3. Введение
  4. Изменения со времени первого издания
  5. Кому адресована эта книга?
  6. Исходный код и опечатки
  7. Благодарности
  8. Выходные сведения
  9. От издательства
  10. ЧАСТЬ 1 ВВЕДЕНИЕ В IPC UNIX
  11. ГЛАВА 1 Обзор средств взаимодействия процессов Unix
  12. 1.1. Введение
  13. 1.2. Процессы, потоки и общий доступ к информации
  14. Потоки
  15. 1.3. Живучесть объектов IPC
  16. 1.4. Пространства имен
  17. 1.5. Действие команд fork, exec и exit на объекты IPC
  18. 1.6. Обработка ошибок: функции-обертки
  19. Листинг 1.1. Функция-обертка к функции sem_post
  20. Листинг 1.2. Реализация обертки к функции pthread_mutex_lock
  21. Значение errno
  22. 1.7. Стандарты Unix
  23. Posix
  24. The Open Group
  25. Версии Unix и переносимость
  26. 1.8. Комментарий к примерам IPC
  27. 1.9. Резюме
  28. Упражнения
  29. ГЛАВА 2 Posix IPC
  30. 2.1. Введение
  31. 2.2. Имена IPC
  32. Функция px_ipc_name
  33. Листинг 2.1. Функция px_ipc_name в нашей реализации.
  34. 2.3. Создание и открытие каналов IPC
  35. 2.4. Разрешения IPC
  36. 2.5. Резюме
  37. Упражнения
  38. ГЛАВА 3 System V IPC
  39. 3.1. Введение
  40. 3.2. Ключи типа key_t и функция ftok
  41. Пример
  42. Листинг 3.1 [1] . Получение и вывод информации о файле и созданного ключа IPC
  43. 3.3. Структура ipc_perm
  44. 3.4. Создание и открытие каналов IPC
  45. 3.5. Разрешения IPC
  46. 3.6. Повторное использование идентификаторов
  47. Листинг 3.2. Вывод идентификатора очереди сообщений десять раз подряд
  48. 3.7. Программы ipcs и ipcrm
  49. 3.8. Ограничения ядра
  50. 3.9. Резюме
  51. Упражнения
  52. ЧАСТЬ 2 ОБМЕН СООБЩЕНИЯМИ
  53. ГЛАВА 4 Именованные и неименованные каналы
  54. 4.1. Введение
  55. 4.2. Приложение типа клиент-сервер
  56. 4.3. Программные каналы
  57. Пример
  58. Листинг 4.1. Функция main для приложения клиент-сервер, использующего два канала
  59. Создание каналов, вызов fork
  60. Использование waitpid дочерним процессом
  61. Листинг 4.2. Функция client для приложения типа клиент-сервер с двумя каналами
  62. Считывание полного имени из стандартного потока ввода
  63. Копирование из канала в стандартный поток вывода
  64. Листинг 4.3. Функция server для приложения клиент-сервер с двумя каналами
  65. Считывание полного имени файла из канала
  66. Открытие файла, обработка возможной ошибки
  67. Копирование из файла в канал
  68. 4.4. Двусторонние каналы
  69. Листинг 4.4. Двусторонняя связь через двусторонний канал
  70. 4.5. Функции popen и pclose
  71. Пример
  72. Листинг 4.5. Клиент-сервер с использованием popen
  73. 4.6. Именованные каналы (FIFO)
  74. Пример
  75. Листинг 4.6. Функция main приложения клиент-сервер, использующего две очереди
  76. Создание двух FIFO
  77. Пример: неродственные клиент и сервер
  78. Листинг 4.7. Функция main независимого сервера
  79. Листинг 4.8. Заголовочный файл fifo.h, используемый и клиентом, и сервером
  80. Листинг 4.9. Функция main независимого клиента
  81. 4.7. Некоторые свойства именованных и неименованных каналов
  82. 4.8. Один сервер, несколько клиентов
  83. Листинг 4.10. Сервер, обслуживающий несколько клиентов с помощью канала FIFO
  84. Создание канала и открытие его только для записи и только для чтения
  85. Считывание запроса от клиента
  86. Анализ запроса клиента
  87. Открытие файла и отправка его в FIFO клиента
  88. Листинг 4.11. Клиент, связывающийся с сервером (листинг 4.10) с помощью канала FIFO
  89. Создание канала
  90. Формирование строки запроса
  91. Открытие канала сервера и отправка запроса
  92. Прием содержимого файла или сообщения об ошибке от сервера
  93. Атомарность записи в FIFO
  94. FIFO и NFS
  95. 4.9. Последовательные и параллельные серверы
  96. Атака типа «отказ в обслуживании»
  97. 4.10. Потоки и сообщения
  98. Листинг 4.12. Структура mymesg и сопутствующие определения
  99. Листинг 4.13. Функция mesg_send
  100. Листинг 4.14. Функция mesg_recv
  101. Листинг 4.15. Функция client с использованием сообщений
  102. Считывание имени файла и отправка его серверу
  103. Считывание содержимого файла или сообщения об ошибке от сервера
  104. Листинг 4.16. Функция server, использующая сообщения
  105. Считывание имени файла из канала IPC, открытие файла
  106. Отправка файла клиенту
  107. 4.11. Ограничения программных каналов и FIFO
  108. Листинг 4.17. Определение значений PIPE_BUF и OPEN_MAX во время выполнения
  109. 4.12. Резюме
  110. Упражнения
  111. ГЛАВА 5 Очереди сообщений Posix
  112. 5.1. Введение
  113. 5.2. Функции mq_open, mq_close, mq_unlink
  114. Пример: программа mqcreate1
  115. Листинг 5.1. Создание очереди сообщений (указан флаг O_EXCL)
  116. Пример: программа mqunlink
  117. Листинг 5.2. Удаление очереди из системы: mqunlink
  118. 5.3. Функции mq_getattr и mq_setattr
  119. Пример: программа mqgetattr
  120. Листинг 5.3. Получение и вывод значений атрибутов очереди сообщений
  121. Пример: программа mqcreate
  122. Листинг 5.4. Усовершенствованная программа mqcreate
  123. 5.4. Функции mqsend и mqreceive
  124. Пример: программа mqsend
  125. Листинг 5.5. Программа mqsend
  126. Пример: программа mqreceive
  127. Листинг 5.6. Программа mqreceive
  128. Параметр -n запрещает блокировку
  129. Открытие очереди и получение атрибутов
  130. 5.5. Ограничения очередей сообщений
  131. Пример: программа mqsysconf
  132. Листинг 5.7. Получение ограничений очередей с помощью sysconf
  133. 5.6. Функция mq_notify
  134. Пример: простая программа с уведомлением
  135. Листинг 5.8. Отправка sigusr1 при помещении сообщения в пустую очередь (неправильная версия программы)
  136. Объявление глобальных переменных
  137. Открытие очереди, получение атрибутов, выделение буфера чтения
  138. Установка обработчика сигнала, включение уведомления
  139. Бесконечный цикл
  140. Получение сигнала, считывание сообщения
  141. Сигналы Posix: функции типа Async-Signal-Safe
  142. Пример: уведомление сигналом
  143. Глобальная переменная
  144. Открытие очереди сообщений
  145. Инициализация наборов сигналов
  146. Установка обработчика сигнала, включение уведомления
  147. Листинг 5.9. Обработчик сигнала устанавливает флаг для главного потока (неправильная версия)
  148. Ожидание установки флага обработчиком
  149. Перерегистрация и считывание сообщения
  150. Пример: уведомление сигналом с отключением блокировки
  151. Листинг 5.10. Использование уведомления с помощью сигнала для считывания сообщения из очереди сообщений Posix
  152. Открытие очереди сообщений в режиме отключенной блокировки
  153. Считывание всех сообщений из очереди
  154. Пример: уведомление с использованием sigwait вместо обработчика
  155. Листинг 5.11. Использование mq_notify совместно с sigwait
  156. Инициализация набора сигналов и блокировка SIGUSR1
  157. Ожидание сигнала
  158. Пример: очереди сообщений Posix и функция select
  159. Листинг 5.12. Использование уведомления с помощью сигнала и канала
  160. Создание канала
  161. Вызов select
  162. Обработчик сигнала
  163. Пример: запуск нового потока
  164. Листинг 5.13. Функция mq_notify, запускающая новый программный поток
  165. 5.7. Сигналы реального времени Posix
  166. Пример
  167. Листинг 5.14. Тестовая программа, иллюстрирующая работу с сигналами реального времени
  168. Вывод номеров сигналов реального времени
  169. Вызов fork и блокирование трех сигналов реального времени
  170. Установка обработчика сигнала
  171. Ожидание порождения сигналов родительским процессом, разблокирование сигналов
  172. Родительский процесс отправляет девять сигналов
  173. Обработчик сигнала
  174. Функция signal _rt
  175. Листинг 5.15. Функция signal_rt с поддержкой реального времени
  176. Упрощение прототипа функции с использованием typedef
  177. Указание функции-обработчика
  178. Установка SA_SIGINFO
  179. 5.8. Реализация с использованием отображения в память
  180. Тип mqd_t
  181. Листинг 5.16. Заголовочный файл mqueue.h
  182. Структура mq_hdr
  183. Структура msg_hdr
  184. Структура mq_info
  185. Макрос MSGSIZE
  186. Функция mq_open
  187. Листинг 5.17. Функция mq_open: первая часть
  188. Обработка списка аргументов переменного размера
  189. Создание новой очереди сообщений
  190. Обработка потенциальной ситуации гонок
  191. Проверка атрибутов
  192. Листинг 5.18. Вторая часть функции mq_open: инициализация новой очереди
  193. Установка размера файла
  194. Отображение файла в память
  195. Выделение памяти под структуру mq_info
  196. Инициализация структуры mq_hdr
  197. Инициализация взаимного исключения и условной переменной
  198. Сброс бита user-execute
  199. Листинг 5.19. Третья часть функции mq_open: открытие существующей очереди сообщений
  200. Открытие существующей очереди сообщений
  201. Проверка готовности очереди
  202. Отображение файла в память; создание и инициализация структуры mq_info
  203. Обработка ошибок
  204. Функция mq_close
  205. Листинг 5.20. Функция mq_close
  206. Получение указателей на структуры
  207. Сброс регистрации вызвавшего процесса
  208. Отключение отображения файла и освобождение памяти
  209. Функция mq_unlink
  210. Листинг 5.21. Функция mq_unlink
  211. Функция mq_getattr
  212. Листинг 5.22. Функция mq_getattr
  213. Блокирование взаимного исключения
  214. Функция mq_setattr
  215. Считывание текущих атрибутов
  216. Изменение mq_flags
  217. Листинг 5.23. Функция mq_setattr
  218. Функция mq_notify
  219. Листинг 5.24. Функция mq_notify
  220. Снятие процесса с регистрации
  221. Регистрация вызвавшего процесса
  222. Функция mq_send
  223. Инициализация
  224. Проверка очереди на пустоту и отправка уведомления
  225. Проверка заполненности очереди
  226. Листинг 5.25. Функция mq_send: первая половина
  227. Листинг 5.25. Функция mq_send: вторая половина
  228. Получение индекса свободного блока
  229. Копирование сообщения
  230. Помещение нового сообщения в соответствующее место связного списка
  231. Пробуждение любого процесса, заблокированного в вызове mq_receive
  232. Функция mq_receive
  233. Проверка полноты очереди
  234. Листинг 5.27.Функция mq_receive: первая половина
  235. Листинг 5.28. Функция mq_receive: вторая половина
  236. Возвращение сообщения вызвавшему процессу
  237. Разблокирование процесса, заблокированного в вызове mq_send
  238. 5.9. Резюме
  239. Упражнения
  240. ГЛАВА 6 Очереди сообщений System V
  241. 6.1. Введениеы
  242. 6.2. Функция msgget
  243. 6.3. Функция msgsnd
  244. 6.4. Функция msgrcv
  245. 6.5. Функция msgctl
  246. Пример
  247. Листинг 6.1. [1] Пример использования функции msgctl с командой IPC_STAT
  248. 6.6. Простые примеры
  249. Программа msgcreate
  250. Листинг 6.2. Создание очереди сообщений System V
  251. Программа msgsnd
  252. Листинг 6.3. Помещение сообщения в очередь System V
  253. Программа msgrcv
  254. Листинг 6.4. Считывание сообщения из очереди System V
  255. Программа msgrmid
  256. Листинг 6.5. Удаление очереди сообщений System V
  257. Примеры
  258. Программа msgrcvid
  259. Листинг 6.6. Считывание из очереди сообщений System V с известным идентификатором
  260. 6.7. Пример программы клиент-сервер
  261. Листинг 6.7. Заголовочный файл svmsg.h для программы клиент-сервер, использующей очереди сообщений
  262. Листинг 6.8. Функция main программы-сервера, использующей очереди сообщений
  263. Листинг 6.9. Функция main программы-клиента, использующей очереди сообщений
  264. Листинг 6.10. Функция mesg_send, работающая с очередью сообщений System V
  265. Листинг 6.11. Функция mesg_recv, работающая с очередью сообщений System V
  266. 6.8. Мультиплексирование сообщений
  267. Пример: одна очередь на приложение
  268. Листинг 6.12. Функция main сервера
  269. Листинг 6.13. Функция server
  270. Листинг 6.14. Функция main клиента
  271. Листинг 6.15. Функция client
  272. Пример: одна очередь для каждого клиента
  273. Листинг 6.16. Функция main клиента
  274. Листинг 6.17. Функция client
  275. Установка обработчика сигнала для SIGCHLD
  276. Листинг 6.18. Обработчик сигнала SIGCHLD, вызывающий waitpid
  277. Листинг 6.19. Функция server
  278. Листинг 6.20. Функция-обертка Mesg_recv, обрабатывающая прерванный системный вызов
  279. 6.9. Использование select и poll с очередями сообщений
  280. 6.10. Ограничения, накладываемые на очереди сообщений
  281. Пример
  282. Листинг 6.21. Определение системных ограничений для очередей сообщений System V
  283. Определение максимального размера сообщения
  284. Сколько сообщений различного размера может быть помещено в очередь?
  285. Сколько идентификаторов может быть открыто одновременно?
  286. 6.11. Резюме
  287. Упражнения
  288. ЧАСТЬ 3 СИНХРОНИЗАЦИЯ
  289. ГЛАВА 7 Взаимные исключения и условные переменные
  290. 7.1. Введение
  291. 7.2. Взаимные исключения: установка и снятие блокировки
  292. 7.3. Схема производитель-потребитель
  293. Листинг 7.1. [1] Функция main
  294. Совместное использование глобальных переменных потоками
  295. Аргументы командной строки
  296. Установка уровня параллельности
  297. Создание процессов-производителей
  298. Ожидание завершения работы производителей, запуск потребителя
  299. Листинг 7.2. Функции produce и consume
  300. Формирование данных
  301. Потребитель проверяет содержимое массива
  302. 7.4. Блокировка и ожидание
  303. Листинг 7.3. Функция main: запуск потребителя сразу после запуска производителей
  304. Листинг 7.4. Функции consume и consume_wait
  305. Потребитель должен ждать
  306. Ожидание производителей
  307. 7.5. Условные переменные: ожидание и сигнализация
  308. Переменные производителя и взаимное исключение объединяются в структуру
  309. Листинг 7.5. Глобальные переменные: использование условной переменной
  310. Листинг 7.6. Функции produce и consume
  311. Помещение очередного элемента в массив
  312. Уведомление потребителя
  313. Потребитель ждет, пока значение nready.nready не станет отличным от нуля
  314. Исключение конфликтов блокировок
  315. 7.6. Условные переменные: время ожидания и широковещательная передача
  316. 7.7. Атрибуты взаимных исключений и условных переменных
  317. Завершение процесса, заблокировавшего ресурс
  318. 7.8. Резюме
  319. Упражнения
  320. ГЛАВА 8 Блокировки чтения-записи
  321. 8.1. Введение
  322. 8.2. Получение и сброс блокировки чтения-записи
  323. 8.3. Атрибуты блокировки чтения-записи
  324. 8.4. Реализация с использованием взаимных исключений и условных переменных
  325. Тип данных pthread_rwlock_t
  326. Листинг 8.1. Определение типа данных pthread_rwlock_t
  327. Функция pthread_rwlock_init
  328. Листинг 8.2. Функция pthread_rwlock_init: инициализация блокировки чтения-записи
  329. Функция pthread_rwlock destroy
  330. Листинг 8.З. Функция pthread_rwlock_destroy: уничтожение блокировки чтения-записи
  331. Функция pthread_rwlock_rdlock
  332. Листинг 8.4. Функция pthread_rwlock_rdlock: получение блокировки на чтение
  333. Функция pthread_rwlock_tryrdlock
  334. Листинг 8.5. Функция pthread_rwlock_tryrdlock: попытка заблокировать ресурс для чтения
  335. Функция pthread_rwlock_wrlock
  336. Листинг 8.6. Функция pthread_rwlock_wrlock: получение блокировки на запись
  337. Функция pthread_rwlock_trywrlock
  338. Листинг 8.7. Функция pthread_rwlock_trywrlock: попытка получения блокировки на запись
  339. Функция pthread _rwlock_unlock
  340. Листинг 8.8. Функция pthread_rwlock_unlock: разблокирование ресурса
  341. 8.5. Отмена выполнения потоков
  342. Пример
  343. Создание двух потоков
  344. Ожидание завершения потоков
  345. Листинг 8.9. Тестовая программа, иллюстрирующая отмену выполнения потока
  346. Функция thread1
  347. Функция thread2
  348. Листинг 8.10. Функция rwlock_cancelrdwait: обработчик для блокировки чтения
  349. Листинг 8.11. Функция rwlock_cancelwrwait: обработчик для блокировки записи
  350. 8.6. Резюме
  351. Упражнения
  352. ГЛАВА 9 Блокирование записей
  353. 9.1. Введение
  354. Листинг 9.1. Функции, не осуществляющие блокировку
  355. Листинг 9.2. Функция main для примеров с блокировкой файла
  356. 9.2. Блокирование записей и файлов
  357. История
  358. 9.3. Блокирование записей с помощью fcntl по стандарту Posix
  359. Пример
  360. Листинг 9.3. Блокировка записей fcntl по стандарту Posix
  361. Пример: упрощение с помощью макросов
  362. Листинг 9.4. Вызов fcntl для получения и снятия блокировки
  363. Листинг 9.5. Вызов fcntl для проверки состояния блокировки
  364. 9.4. Рекомендательная блокировка
  365. Пример: несотрудничающие процессы
  366. 9.5. Обязательная блокировка
  367. Пример
  368. 9.6. Приоритет чтения и записи
  369. Пример: блокировка на чтение при наличии в очереди блокировки на запись
  370. Листинг 9.6. Определение возможности установки блокировки на чтение при наличии в очереди блокировки на запись
  371. Родительский процесс открывает файл и получает блокировку на чтение
  372. Первый дочерний процесс
  373. Второй дочерний процесс
  374. Родительский процесс блокирует ресурс 5 секунд
  375. Пример: имеют ли приоритет запросы на запись перед запросами на чтение?
  376. Листинг 9.7. Есть ли у писателей приоритет перед читателями
  377. Родительский процесс создает файл и устанавливает блокировку на запись
  378. Первый дочерний процесс
  379. Второй дочерний процесс
  380. 9.7. Запуск единственного экземпляра демона
  381. Листинг 9.8. Гарантия выполнения единственного экземпляра программы
  382. Открытие и блокирование файла
  383. Запись идентификатора процесса в файл
  384. 9.8. Блокирование файлов
  385. Листинг 9.9. Функции блокировки с использованием open с флагами O_CREAT и O_EXCL
  386. 9.9. Блокирование в NFS
  387. 9.10. Резюме
  388. Упражнения
  389. ГЛАВА 10 Семафоры Posix
  390. 10.1. Введение
  391. Листинг 10.1. Сравнение бинарных семафоров и взаимных исключений
  392. Листинг 10.2. Псевдокод для задачи производителя и потребителя
  393. 10.2. Функции sem_open, sem_close и sem_unlink
  394. 10.3. Функции sem_wait и sem_trywait
  395. 10.4. Функции sem_post и sem_getvalue
  396. 10.5. Простые примеры
  397. Программа semcreate
  398. Листинг 10.3. [1] Создание именованного семафора
  399. Создание семафора
  400. Закрытие семафора
  401. Программа semunlink
  402. Листинг 10.4. Удаление именованного семафора
  403. Программа semgetvalue
  404. Листинг 10.5. Получение и вывод значения семафора
  405. Открытие семафора
  406. Программа semwait
  407. Листинг 10.6. Ожидание изменения значения семафора и вывод нового значения
  408. Программа sempost
  409. Листинг 10.7. Увеличение значения семафора
  410. Примеры
  411. 10.6. Задача производителей и потребителей
  412. Листинг 10.8. Функция main для решения задачи производителей и потребителей с помощью семафоров
  413. Глобальные переменные
  414. Создание семафоров
  415. Создание двух потоков
  416. Листинг 10.9. Функции produce и consume
  417. Производитель ожидает освобождения места в буфере
  418. Производитель помещает элемент в буфер
  419. Потребитель ожидает изменения семафора nstored
  420. Зависание
  421. 10.7. Блокирование файлов
  422. Листинг 10.10. Блокирование файла с помощью именованных семафоров Posix
  423. 10.8. Функции sem_init и sem_destroy
  424. Пример
  425. Листинг 10.11. Задача производителей и потребителей с использованием размещаемых в памяти семафоров
  426. Выделение семафоров
  427. Вызов sem_init
  428. 10.9. Несколько производителей, один потребитель
  429. Листинг 10.12. Функция main задачи с несколькими производителями
  430. Глобальные переменные
  431. Общая структура
  432. Новые аргументы командной строки
  433. Запуск всех потоков
  434. Листинг 10.13. Функция, выполняемая всеми потоками-производителями
  435. Взаимное исключение между потоками-производителями
  436. Завершение производителей
  437. Листинг 10.14. Функция, выполняемая потоком-потребителем
  438. 10.10. Несколько производителей, несколько потребителей
  439. Листинг 10.15. Глобальные переменные
  440. Глобальные переменные и общая структура
  441. Листинг 10.16. Функция main для версии с несколькими производителями и потребителями
  442. Листинг 10.17. Функция, выполняемая всеми потоками-потребителями
  443. Завершение потоков-потребителей
  444. 10.11. Несколько буферов
  445. Листинг 10.18. Глобальные переменные и функция main
  446. Объявление нескольких буферов
  447. Открытие входного файла
  448. Листинг 10.19. Функции produce и consume
  449. Пустая критическая область
  450. Считывание данных и увеличение семафора nstored
  451. Поток-потребитель
  452. 10.12. Использование семафоров несколькими процессами
  453. 10.13. Ограничения на семафоры
  454. Пример: программа semsysconf
  455. Листинг 10.20. Вызов sysconf для получения ограничений на семафоры
  456. 10.14. Реализация с использованием FIFO
  457. Листинг 10.21. Заголовочный файл semaphore.h
  458. Тип данных sem_t
  459. Функция sem_open
  460. Листинг 10.22. Функция sem_open
  461. Создание нового sсемафора
  462. Создание нового канала FIFO
  463. Выделение памяти под тип sem_t и открытие FIFO на чтение и запись
  464. Инициализация значения созданного семафора
  465. Функция sem_close
  466. Листинг 10.23. Функция sem_close
  467. Функция sem_unlink
  468. Листинг 10.24. Функция sem_unlink
  469. Функция sem_post
  470. Листинг 10.25. Функция sem_post
  471. Функция sem_wait
  472. Листинг 10.26. Функция sem_wait
  473. 10.15. Реализация с помощью отображения в память
  474. Тип sem_t
  475. Листинг 10.27. Заголовочный файл semaphore.h
  476. Функция sem_open
  477. Листинг 10.28. Функция sem_open: первая половина
  478. Работа со списком аргументов переменной длины
  479. Создание нового семафора и обработка потенциальной ситуации гонок
  480. Установка размера файла
  481. Отображение содержимого файла в память
  482. Инициализация структуры sem_t
  483. Инициализация значения семафора
  484. Сброс бита user-execute
  485. Листинг 10.29. Функция sem_open: вторая половина
  486. Открытие существующего семафора
  487. Удостоверимся, что семафор проинициализирован
  488. Возврат кодов ошибок
  489. Функция sem_close
  490. Листинг 10.30. Функция sem_close
  491. Функция sem_unlink
  492. Листинг 10.31. Функция sem_unlink
  493. Функция sem_post
  494. Листинг 10.32. Функция sem_post
  495. Функция sem_wait
  496. Листинг 10.33. Функция sem_wait
  497. Функция sem_trywait
  498. Листинг 10.34. Функция sem_trywait
  499. Функция sem_getvalue
  500. Листинг 10.35. Функция sem_getvalue
  501. 10.16. Реализация с использованием семафоров System V
  502. Листинг 10.36. Заголовочный файл semaphore.h
  503. Тип данных sem_t
  504. Функция sem_open
  505. Листинг 10.37. Функция sem_open: первая часть
  506. Создание нового семафора и работа со списком аргументов переменной длины
  507. Создание вспомогательного файла и преобразование полного имени в ключ System V IPC
  508. Создание набора семафоров System V с одним элементом
  509. Инициализация семафора
  510. Проверка начального значения
  511. Листинг 10.38. Функция sem_open: вторая половина
  512. Открытие существующего семафора
  513. Ожидание инициализации семафора
  514. Возврат кода ошибки
  515. Выделение памяти под sem_t
  516. Функция sem_close
  517. Листинг 10.39. Функция sem_close
  518. Функция sem_unlink
  519. Листинг 10.40. Функция sem_unlink
  520. Получение ключа System V по полному имени
  521. Функция sem_post
  522. Листинг 10.41. Функция sem_post
  523. Функция sem_wait
  524. Листинг 10.42. Функция sem_wait
  525. Функция sem_trywait
  526. Листинг 10.43. Функция sem_trywait
  527. Функция sem_getvalue
  528. Листинг 10.44. Функция sem_getvalue
  529. 10.17. Резюме
  530. Упражнения
  531. ГЛАВА 11 Семафоры System V
  532. 11.1. Введение
  533. 11.2. Функция semget
  534. Инициализация значения семафора
  535. 11.3. Функция semop
  536. 11.4. Функция semctl
  537. 11.5. Простые программы
  538. Программа semcreate
  539. Листинг 11.1. Программа semcreate
  540. Программа semrmid
  541. Листинг 11.2. Программа semrmid
  542. Программа semsetvalues
  543. Получение количества семафоров в наборе
  544. Установка всех значений
  545. Листинг 11.3. Программа semsetvalues
  546. Программа semgetvalues
  547. Получение количества семафоров в наборе
  548. Получение всех значений
  549. Листинг 11.4. Программа semgetvalues
  550. Программа semops
  551. Параметры командной строки
  552. Выделение памяти под набор операций
  553. Выполнение операций
  554. Листинг 11.5. Программа semops
  555. Примеры
  556. 11.6. Блокирование файлов
  557. Листинг 11.6. Блокировка файлов с помощью семафоров System V
  558. Попытка исключающего создания
  559. Семафор уже существует, мы его открываем
  560. Ожидание инициализации семафора
  561. Инициализация структур sembuf
  562. 11.7. Ограничения семафоров System V
  563. Пример
  564. Листинг 11.7. Определение системных ограничений на семафоры System V
  565. 11.8. Резюме
  566. Упражнения
  567. ЧАСТЬ 4 РАЗДЕЛЯЕМАЯ ПАМЯТЬ
  568. ГЛАВА 12 Введение в разделяемую память
  569. 12.1. Введение
  570. Листинг 12.1. Увеличение глобального счетчика родительским и дочерним процессами
  571. Создание и инициализация семафора
  572. Отключение буферизации стандартного потока вывода и вызов fork
  573. 12.2. Функции mmap, munmap и msync
  574. Почему вообще используется отображение в память?
  575. 12.3. Увеличение счетчика в отображаемом в память файле
  576. Листинг 12.2. Родительский и дочерний процессы увеличивают значение счетчика в разделяемой памяти
  577. Новый аргумент командной строки
  578. Вызов mmap и закрытие дескриптора
  579. fork
  580. Листинг 12.3. Счетчик и семафор размещены в разделяемой памяти
  581. Определение структуры, хранящейся в разделяемой памяти
  582. Отображаем в память
  583. Инициализация семафора
  584. 12.4. Неименованное отображение в память в 4.4BSD
  585. Листинг 12.4. Отображение в память в 4.4BSD
  586. 12.5. Отображение в память в SVR4 с помощью /dev/zero
  587. Листинг 12.5. Отображение памяти в SVR4 с помощью /dev/zero
  588. 12.6. Обращение к объектам, отображенным в память
  589. Листинг 12.6. Отображение файла: размер файла совпадает с размером области памяти
  590. Аргументы командной строки
  591. Создание, открытие, урезание файла; установка его размера
  592. Отображение файла в память
  593. Вывод размера страницы памяти
  594. Чтение и запись в область отображения
  595. Листинг 12.7. Отображение увеличивающегося файла в память
  596. Открытие файла
  597. Увеличение размера файла
  598. 12.7. Резюме
  599. Упражнения
  600. ГЛАВА 13 Разделяемая память Posix
  601. 13.1. Введение
  602. 13.2. Функции shm_open и shm_unlink
  603. 13.3. Функции ftruncate и fstat
  604. 13.4. Простые программы
  605. Программа shmcreate
  606. Листинг 13.1. Создание объекта разделяемой памяти Posix указанного размера
  607. Программа shmunlink
  608. Листинг 13.2. Удаление имени объекта разделяемой памяти Posix
  609. Программа shmwrite
  610. Листинг 13.3. Заполнение разделяемой памяти
  611. Программа shmread
  612. Листинг 13.4. Проверка значений в разделяемой памяти
  613. Примеры
  614. Пример
  615. Листинг 13.5. Разделяемая память может начинаться с разных адресов в разных процессах
  616. 13.5. Увеличение общего счетчика
  617. Листинг 13.6. Программа, создающая и инициализирующая объект разделяемой памяти и семафор
  618. Создание объекта разделяемой памяти
  619. Создание и инициализация семафора
  620. Завершение работы процесса
  621. Листинг 13.7. Программа, увеличивающая значение счетчика в разделяемой памяти
  622. Открытие области разделяемойпамяти
  623. Открытие семафора
  624. Блокирование семафора и увеличение счетчика
  625. 13.6. Отправка сообщений на сервер
  626. Листинг 13.8. Заголовочный файл, определяющий содержимое разделяемой памяти
  627. Основные семафоры и переменные
  628. Счетчик переполнений
  629. Сдвиги сообщений и их содержимое
  630. Листинг 13.9. Сервер, считывающий сообщения из разделяемой памяти
  631. Создание объекта разделяемой памяти
  632. Инициализация массива сдвигов
  633. Инициализация семафоров
  634. Ожидание сообщения , вывод его содержимого
  635. Обработка переполнений
  636. Листинг 13.10. Клиент, помещающий сообщения в разделяемую память
  637. Аргументы командной строки
  638. Открытие и отображение разделяемой памяти
  639. Отправка сообщений
  640. 13.7. Резюме
  641. Упражнения
  642. ГЛАВА 14 Разделяемая память System V
  643. 14.1. Введение
  644. 14.2. Функция shmget
  645. 14.3. Функция shmat
  646. 14.4. Функция shmdt
  647. 14.5. Функция shmctl
  648. 14.6. Простые программы
  649. Программа shmget
  650. Листинг 14.1. Создание сегмента разделяемой памяти System V указанного размера
  651. Программа shmrmid
  652. Листинг 14.2. Удаление сегмента разделяемой памяти system V из системы
  653. Программа shmwrite
  654. Листинг 14.3. Заполнение сегмента разделяемой памяти последовательностью чисел
  655. Программа shmread
  656. Листинг 14.4. Проверка значений в сегменте разделяемой памяти
  657. Примеры
  658. 14.7. Ограничения, накладываемые на разделяемую память
  659. Пример
  660. Листинг 14.5. Определение системных ограничений на разделяемую память
  661. 14.8. Резюме
  662. Упражнение
  663. ЧАСТЬ 5 УДАЛЕННЫЙ ВЫЗОВ ПРОЦЕДУР
  664. ГЛАВА 15 Двери
  665. 15.1. Введение
  666. Пример
  667. Листинг 15.1 .Клиент передает серверу длинное целое для возведения его в квадрат
  668. Открываем дверь
  669. Подготовка аргументов и указателя на результат
  670. Вызов процедуры на сервере и вывод результата
  671. Листинг 15.2. Сервер, возводящий длинное целое в квадрат
  672. Процедура сервера
  673. Создание дескриптора двери и связывание с ним файла
  674. Главный поток сервера ничего не делает
  675. 15.2. Функция door_call
  676. 15.3. Функция door_create
  677. 15.4. Функция door_return
  678. 15.5. Функция door_cred
  679. 15.6. Функция door_info
  680. 15.7. Примеры
  681. Функция door_info
  682. Листинг 15.3. Вывод информации о двери
  683. Буфер результатов слишком мал
  684. Листинг 15.4. Вывод адреса полученного результата
  685. Функция door_cred и информация о клиенте
  686. Листинг 15.5. Процедура сервера, получающая информацию о клиенте
  687. Автоматическое управление потоками сервера
  688. Листинг 15.6. Процедура сервера, выводящая идентификатор потока
  689. Листинг 15.7. Функция pr_thread_id: возвращает небольшой целочисленный идентификатор потока
  690. Автоматическое управление потоками сервера: несколько процедур
  691. Листинг 15.8. Заголовочный файл squareproc.h
  692. Листинг 15.9. Заголовочный файл sqrtproc.h
  693. Листинг 15.10. Клиент, вызывающий две процедуры
  694. Листинг 15.11. Две процедуры сервера
  695. Листинг 15.12. Функция main сервера
  696. Атрибут DOOR_UNREF для серверов
  697. Листинг 15.13. Процедура сервера, обрабатывающая специальный вызов
  698. Листинг 15.14. Сервер, не закрывающий дескриптор двери
  699. 15.8. Передача дескрипторов
  700. Пример
  701. Листинг 15.15. Клиент для сервера, передающего дескриптор
  702. Открываем дверь, считываем полное имя файла
  703. Подготовка аргументов и указателя на буфер возврата
  704. Вызов процедуры сервера и проверка результатов
  705. Считывание дескриптора и копирование файла
  706. Листинг 15.16. Процедура сервера, открывающая файл и возвращающая клиенту дескриптор
  707. Открытие файла для клиента
  708. Успешное открытие файла
  709. 15.9. Функция door server_create
  710. Листинг 15.17. Функция main для примера с управлением пулом потоков
  711. Листинг 15.18. Функции управления потоками
  712. Процедура создания сервера
  713. Функция, запускающая поток
  714. Ожидание присваивания дескриптору правильного значения
  715. Отключение отмены потока
  716. Связывание потока с дверью
  717. Делаем поток доступным клиенту
  718. Листинг 15.19. Процедура сервера
  719. 15.10. Функции door_bind, door unbind и door_revoke
  720. 15.11. Досрочное завершение клиента или сервера
  721. Досрочное завершение сервера
  722. Листинг 15.20. Процедура сервера, завершающая работу сразу после запуска
  723. Непрерываемость системного вызова door_call
  724. Листинг 15.21. Процедура сервера делает паузу в 6 секунд
  725. Листинг 15.22. Клиент, перехватывающий сигнал SIGCHLD
  726. Идемпотентные и неидемпотентные процедуры
  727. Листинг 15.23. Процедура сервера, выводящая свой идентификатор потока дважды
  728. Листинг 15.24. Клиент, вызывающий door_call еще раз, после перехвата EINTR
  729. Досрочное завершение клиента
  730. Листинг 15.25. Клиент, досрочно завершающий работу после вызова door_call
  731. Листинг 15.26. Процедура сервера, обрабатывающая досрочное завершение клиента
  732. 15.12. Резюме
  733. Упражнения
  734. ГЛАВА 16 Пакет Sun RPC
  735. 16.1. Введение
  736. Пример
  737. Листинг 16.1. Файл спецификации RPC
  738. Определение аргумента и возвращаемого значения
  739. Определение программы, версии и процедуры
  740. Листинг 16.2. Функция main клиента, делающего удаленный вызов процедуры
  741. Подключение заголовочного файла, создаваемого rpcgen
  742. Объявление дескриптора клиента
  743. Получение дескриптора клиента
  744. Вызов удаленной процедуры и вывод результата
  745. Листинг 16.3. Процедура сервера, вызываемая с помощью Sun RPC
  746. Аргументы процедуры
  747. Выполнение и возврат
  748. История
  749. 16.2. Многопоточность
  750. Листинг 16.4. Процедура сервера с 5-секундной паузой
  751. Листинг 16.5. Функция main клиента многопоточного сервера
  752. Объявление переменной для помещения результата
  753. Новый аргумент в вызове процедуры
  754. Листинг 16.6. Процедура многопоточного сервера
  755. Новые аргументы и возвращаемое значение
  756. Новая функция, освобождающая память XDR
  757. 16.3. Привязка сервера
  758. Inetd и серверы RPC
  759. 16.4. Аутентификация
  760. Листинг 16.7. Клиент, осуществляющий аутентификацию unix
  761. Листинг 16.8. Процедура сервера, запрашивающая аутентификацию Unix
  762. 16.5. Тайм-аут и повторная передача
  763. Листинг 16.9. Клиент, получающий и печатающий значения времени ожидания RPC
  764. Используемый протокол является аргументом командной строки
  765. Получение значения общего тайм-аута
  766. Попытка получения тайм-аута повтора
  767. Управление соединением по TCP
  768. Листинг 16.10. Клиент для изучения свойств соединения по TCP
  769. Идентификатор транзакций
  770. Кэш повторных ответов
  771. 16.6. Семантика вызовов
  772. 16.7. Досрочное завершение сервера или клиента
  773. Досрочное завершение сервера
  774. Досрочное завершение клиента
  775. 16.8. XDR: представление внешних данных
  776. Пример: использование XDR без RPC
  777. Листинг 16.11. Файл спецификации XDR
  778. Объявление перечисления и размеченного объединения
  779. Объявление структуры
  780. Листинг 16.12. Заголовочный файл data.h, созданный rpcgen из файла data.x
  781. Листинг 16.13. Инициализация структуры и кодирование ее в XDR
  782. Инициализация элементов структуры ненулевыми значениями
  783. Выделение буфера
  784. Создание потока XDR в памяти
  785. Кодирование структуры
  786. Получение размера кодированных данных и запись их в поток вывода
  787. Листинг 16.14. Считывание структуры data из формата XDR
  788. Выделение правильно расположенного буфера
  789. Создание потока XDR, инициализация буфера, декодирование
  790. Вывод значений полей структуры
  791. Освобождение выделенной под XDR памяти
  792. Пример: вычисление размера буфера
  793. Листинг 16.15. Спецификация XDR для простой структуры
  794. Листинг 16.16. Программа, вычисляющая размер буфера XDR
  795. Пример: необязательные данные
  796. Листинг 16.17. Файл спецификации XDR, иллюстрирующий способы задания необязательных данных
  797. Объявление объединения с булевским дискриминантом
  798. Объявление массива переменной длины
  799. Объявление указателя XDR
  800. Листинг 16.18. Заголовочный файл, получившийся в результате обработки листинга 16.17
  801. Листинг 16.19. Ни одно из значений не будет закодировано
  802. Присваивание значений
  803. Выделение буфера и кодирование
  804. Вывод содержимого буфера XDR
  805. Листинг 16.20. Присваивание значений аргументам из листинга 16.17
  806. Присваивание значений
  807. Пример: обработка связного списка
  808. Листинг 16.21. Спецификация XDR для связного списка пар имя-значение
  809. Листинг 16.22. Заголовочный файл, созданный программой rpcgen
  810. Листинг 16.23. Инициализация, кодирование связного списка и вывод результата
  811. Инициализация связного списка
  812. 16.9. Форматы пакетов RPC
  813. 16.10. Резюме
  814. Упражнения
  815. Эпилог
  816. ПРИЛОЖЕНИЕ А Измерение производительности
  817. А.1. Введение
  818. А.2. Результаты
  819. Результаты измерения полосы пропускания сообщений
  820. Результаты измерения задержки
  821. Результаты синхронизации потоков
  822. Результаты синхронизации процессов
  823. А.З. Измерение полосы пропускания: программы
  824. Измерение полосы пропускания канала
  825. Листинг А.1. Функция main, измеряющая полосу пропускания канала
  826. Аргументы командной строки
  827. Выделение буфера и помещение начального значения
  828. Создание двух каналов
  829. Вызов fork
  830. Листинг А.2. Функции reader и writer
  831. Функция writer
  832. Функция reader
  833. Листинг А.З. Функции start_sime, stop_time и touch
  834. Листинг А.4. Функция tv_sub: вычитание двух структур timeval
  835. Измерение полосы пропускания очереди сообщений Posix
  836. Листинг А.5. Функция main для измерения полосы пропускания очереди сообщений Posix
  837. Листинг А.6. Функции reader и writer
  838. Программа измерения полосы пропускания очереди System V
  839. Листинг А.7. Функция main для измерения полосы пропускания очереди сообщений System V
  840. Листинг А.8. Функции reader и writer
  841. Программа измерения полосы пропускания дверей
  842. Листинг А.9. Функция main измерения полосы пропускания интерфейса дверей
  843. Листинг A.10. Функции writer, server, reader для интерфейса дверей
  844. Программа определения полосы пропускания Sun RPC
  845. Листинг А.11. Спецификация RPC для измерения полосы пропускания RPC
  846. Листинг A.12. Клиент RPC для измерения полосы пропускания
  847. Листинг A.13. Процедура сервера для измерения полосы пропускания RPC
  848. А.4. Измерение задержки передачи сообщений: программы
  849. Программа измерения задержки канала
  850. Листинг А.14. Программа измерения задержки канала
  851. Функция doit
  852. Создание каналов
  853. Дочерний процесс отсылает обратно сообщение
  854. Измерение времени работы родительского процесса
  855. Программа измерения задержки очередей сообщений Posix
  856. Листинг А. 15. Программа измерения задержки для очереди сообщений Posix
  857. Измерение задержки очередей сообщений System V
  858. Листинг А.16. Программа измерения времени задержки для очередей сообщений System V
  859. Программа измерения задержки интерфейса дверей
  860. Листинг А.17. Программа измерения задержки интерфейса дверей
  861. Программа измерения времени задержки Sun RPC
  862. Листинг А.18. Клиент Sun RPC для измерения задержки
  863. А.5. Синхронизация потоков: программы
  864. Взаимные исключения Posix
  865. Листинг А.19. Глобальные переменные и функция main для взаимных исключений Posix
  866. Общие данные
  867. Блокирование взаимного исключения и создание потоков
  868. Запуск таймера и разблокирование взаимного исключения
  869. Листинг А.20. Функция incr, выполняемая потоками
  870. Увеличение счетчика — критическая область кода
  871. Блокировки чтения-записи
  872. Листинг А.21. Функция main для блокировок чтения-записи
  873. Листинг А.22. Увеличение общего счетчика с использованием блокировок чтения-записи
  874. Семафоры Posix, размещаемые в памяти
  875. Листинг А.23. Увеличение счетчика с использованием семафоров Posix в памяти
  876. Листинг А.24. Функция main для семафоров Posix, размещаемых в памяти
  877. Именованные семафоры Posix
  878. Листинг А.25. Увеличение общего счетчика с использованием именованного семафора Posix
  879. Листинг А.26. Функция main для измерения быстродействия именованных семафоров Posix
  880. Семафоры System V
  881. Листинг А.27. Функция main для измерения быстродействия семафоров System V
  882. Листинг А.28. Увеличение общего счетчика с использованием семафоров System V
  883. Семафоры System V с флагом SEM_UNDO
  884. Блокировка записей fcntl
  885. Листинг А.29. Увеличение общего счетчика с использованием блокировки записей fcntl
  886. Листинг А.30. Функция main для измерения производительности блокировки fcntl
  887. А.6. Синхронизация процессов: программы
  888. Листинг А.31. Выделение разделяемой памяти под родительский и дочерние процессы
  889. Взаимные исключения Posix между процессами
  890. Листинг А.32. Функция main для измерения быстродействия взаимных исключений между процессами
  891. Листинг А.33. Увеличение счетчика с использованием взаимных исключений между процессами
  892. ПРИЛОЖЕНИЕ Б Основы многопоточного программирования
  893. Б.1. Введение
  894. Б.2. Основные функции для работы с потоками: создание и завершение
  895. Функция pthread_create
  896. Функция pthread_join
  897. Функция pthread_self
  898. Функция pthread_detach
  899. Функция pthread_exit
  900. ПРИЛОЖЕНИЕ В Вспомогательные исходные коды
  901. В.1. Заголовочный файл unpipc.h
  902. Листинг В.1. Заголовочный файл unpipc.h
  903. B.2. Заголовочный файл config.h
  904. Листинг В.2. Заголовочный файл config.h для Solaris 2.6
  905. В.З. Стандартные функции вывода сообщений об ошибках
  906. Листинг В.3. Функции обработки ошибок
  907. ПРИЛОЖЕНИЕ Г Решения некоторых упражнений
  908. Глава 1
  909. Глава 2
  910. Глава 3
  911. Листинг Г.1. Вывод идентификатора и порядкового номера слота
  912. Листинг Г.2. Проверка использования маски создания файла функцией msgget
  913. Глава 4
  914. Листинг Г.З. Возвращает ли fstat количество байтов в канале FIFO?
  915. Листинг Г.4. Что возвращает select при закрытии другого конца канала?
  916. Глава 5
  917. Листинг Г.5. Обертка Select, обрабатывающая возврат EINTR
  918. Глава 6
  919. Глава 7
  920. Глава 9
  921. Глава 10
  922. Листинг Г.6. Возвращает ли sem_wait ошибку EINTR?
  923. Глава 11
  924. Глава 12
  925. Листинг Г.7. Использование select с очередями System V
  926. Глава 13
  927. Листинг Г.8. Отображение с точным указанием размера файла
  928. Листинг Г.9. Отображение в память с возможностью роста файла
  929. Глава 14
  930. Глава 15
  931. Листинг Г.10. Использование указателя cookie для избавления от глобальных переменных
  932. Глава 16
  933. Листинг Г.11. Клиент, вызывающий нулевую процедуру сервера
  934. Литература
  935. Примечания


Ваше впечатление от этой книги  


Полный текст книги (читать онлайн): UNIX: взаимодействие процессов

Скачать эту книгу (1529k) в формате: fb2, lrf, epub, mobi, txt, html

close [X]

close [X]




Комментарии


Ваше имя:     Ваше впечатление от этой книги

Комментарий:


получать комментарии о книге UNIX: взаимодействие процессов на e-mail

Код авторизации Anti spam Capcha