Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты Дорогов.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
1.35 Mб
Скачать

Разрыв соединения

Соединение разрывается с помощью функции

#include <sys/neutrino.h>

int ConnectDetach(int coid);

В качестве аргумента coid выступает ID соединения.

Если во время разрыва соединения какие-либо нити были блокированы в результате посылки сообщения по этому соединению, то нити разблокируются, а посылка сообщения завершается с ошибкой. В случае ошибки функция возвращает ‑1, а в errno помещается код ошибки. Если выполнение успешное, то возвращается произвольное значение отличное от ‑1.

Аннулирование соединений, когда необходимость в них отпадает, необходимо обязательно выполнять, так как ресурсы ядра, связанные с поддержанием соединений, не безграничны.

24 Билет

Многошаговый обмен сообщениями

Part 1

Part 2

Part 3

Len Addr

IOV

Каждая часть может иметь размер от 0 до 4 Гбайт а Структура IOV может состоять из произвольного числа частей

В операционной системе при обмене сообщениями между ее компо-

нентами (например, при обмене с файловой системой) используются сооб-

щения предопределенного формата. Для этого в сообщении выделяется заголовок (обычно длиной 12 байт), который содержит сведения о том, что находится внутри сообщения. Например, подобный заголовок автоматически добавляет системный вызов write() библиотеки языка Си. Компонент операционной системы должен уметь сначала прочитать заголовок, а затем в зависимости от полученной информации принять решение о том, как поступить с остальными частями сообщения. В QNX Neutrino для этой цели

реализовано несколько дополнительных функций, представленных в табл.

Таблица 3.4

Для векторных сообщений Для одиночных сообщений

MsgReadv() MsgRead()

MsgWritev() MsgWrite()

Эти функции имеют дополнительный аргумент offset (смещение) и используются следующим образом:

1. Клиент передает полное сообщение, имеющее заголовок.

2. Сначала сервер принимает сообщение с помощью MsgReceive(),

при этом длина приемного буфера устанавливается равной размеру передаваемого заголовка.

3. Клиент переходит в Reply-блокированное состояние, а сервер тем временем анализирует заголовок сообщения. Заголовок содержит информацию о размещении составных частей сообщения.

4. Сервер считывает сообщение с помощью нескольких вызовов функции MsgRead(), в качестве аргументов функции указывается идентификатор

отправителя полученного сообщения (возвращаемый функцией MsgReceive()), адрес и размер буфера, в который следует записать полученные данные, и смещение offset, с которого надо начинать считывать

данные из буфера клиента. Клиент все это время остается Replyблокированным.

5. Сервер подготавливает ответное сообщение. Он может его отправить единовременно, вызвав MsgReply(), или может записать ответ порциями в буфер клиента, используя вызов MsgWrite() и смещения offset. Но в

этом случае, записав данные, сервер должен для разблокировки клиента обязательно вызвать MsgReply() или MsgError() с нулевым размером буфера