Читать книгу 📗 "Операционная система UNIX - Робачевский Андрей Михайлович"
Помимо указанных полей, структура
queueПередача данных вверх или вниз по потоку осуществляется с помощью функций модуля, указатели на которые хранятся в структуре
qinit<i>xx</i>put()<i>xx</i>service()<i>xx</i>open()<i>xx</i>close()(*qi_putp)()(*qi_srvp)()(*qi_qopen)()(*qi_close)()<i>xx</i>open()<i>xx</i>close()<i>xx</i>put()<i>xx</i>put()<i>xx</i>service()Модуль должен иметь функцию
<i>xx</i>put()<i>xx</i>service()<i>xx</i>put()<i>xx</i>service()Оставшиеся поля структуры
qinitmodule_info | В этой структуре хранятся базовые значения таких параметров, как ватерлинии, размер сообщений и т.д. Некоторые из этих параметров также находятся в структуре queue. Это дает возможность динамически изменять их, сохраняя при этом базовые значения. |
module_stat | Эта структура непосредственно не используется подсистемой STREAMS. Однако модуль имеет возможность осуществлять сбор разнообразной статистики своего участка потока с помощью полей этой структуры. |
Сообщения
В подсистеме STREAMS все данные передаются в виде сообщений. С помощью сообщений передаются данные от приложений к драйверу и обратно. Сообщения используются для взаимодействия модулей между собой. Модули могут также генерировать сообщения для уведомления прикладного процесса или друг друга о возникновении ошибок или непредвиденных ситуаций. Таким образом, сообщения являются единственным способом передачи информации между различными компонентами потока и потому занимают ключевое место в подсистеме STREAMS.
Сообщение описывается двумя структурами данных: заголовком сообщения
msgbdatabЗаголовок сообщения
msgbb_nextb_prev | Используются для формирования связанного списка сообщений и соответственно адресуют следующее и предыдущее сообщение очереди |
b_cont | Указывает на продолжение сообщения и используется для связывания различных частей одного сообщения |
b_datap | Указатель на заголовок блока данных |
b_rptrb_wptr | Указатели, определяющие расположение (начало и конец) данных в буфере данных |
b_cont | Содержит ссылку на следующую структуру msgb |
Заголовок блока данных
databdb_base | Адрес начала буфера |
db_lim | Адрес ячейки памяти, следующей непосредственно за буфером. Таким образом, размер буфера равен db_lim - db_base |
db_type | Тип сообщения |
db_ref | Число заголовков сообщения, адресующих этот блок |
Использование этих структур данных для формирования очереди сообщений и сообщений, состоящих из нескольких частей, показано на рис. 5.17.

Рис. 5.17. Сообщения STREAMS
Поле
b_contb_cont
Рис. 5.18. Инкапсуляция данных с использованием составных сообщений
Поле
db_ref