Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
81
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

7.5. Создание и удаление каналов Создание канала.

Создание канала может быть осуществлено любой нитью процесса (например, main()). Для этого используется функция:

#include <sys/neutrino.h>

int ChannelCreate(unsigned flags);

Аргумент flags представляет собой набор флагов, установка которых определяет поведение канала по отношению к процессу при возникновении особых ситуаций, контролируемых ядром QNX. Значения флагов будет рассматриваться далее по мере необходимости. Пока будем использовать значения флагов по умолчанию, для чего следует положить flags равным 0.

В случае успеха функция возвращает ID созданного канала (chid). Если возникает ошибка, то возвращается ‑1 и в errno помещается код ошибки.

Удаление канала

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

#include <sys/neutrino.h>

int ChannelDesstroy(int chid);

В качестве аргумента chid выступает ID ранее созданного канала. В случае ошибки функция возвращает –1, а в errno помещается код ошибки. Если выполнение успешное, то возвращается произвольное значение отличное от – 1.

7.6. Установление и удаление соединений с каналом Установление соединения

Установление соединения с каналом выполняется нитью с помощью функции:

#include <sys/neutrino.h>

Int ConnectAttach(uint32_t nd, pid_t pid, int chid, unsigned index, int flags);

nd -         ID узла в сети (nd=ND_LOCAL_NODE, если узел местный);

pid -      ID процесса-сервера;

chid -    ID канала сервера;

index - индекс управления значением ID соединения, возвращаемым функцией. Для формирования значения ID соединения по умолчанию - устанавливается равным 0:

flags - набор флагов, установка которых определяет поведение соединения по отношению к нитям процесса-клиента, пославших сообщение по данному соединению, при возникновении особых ситуаций, контролируемых ядром QNX.

Функция ConnectAttach() устанавливает соединение клиента с каналом chid, принадлежащим серверу pid на узле nd. Если узел местный, то nd присваивается значение системной константы ND_LOCAL_NODE. Если в качестве клиента и сервера выступает один и тот же процесс, то значение pid=0.

Если flags содержит системную константу _NTO_COF_CLOEXEC, то соединение будет удаляться, когда клиент вызывает функцию семейства exec*(), чтобы запустить новый процесс.

Функция возвращает значение системного ID соединения. Система возвращает первое доступное значение ID соединения, начинающееся со значения, установленного аргументом index.

Заметим, что при взаимодействии с системными администраторами ввода/вывода также создаются соединения. При этом ID таких соединений трактуются как дескрипторы файлов. Это может приводить к нежелательным последствиям, когда в качестве значения ID создаваемого соединения будет назначено значение, которое ассоциируется с файлом. Поэтому для гарантии создания соединения с требуемым каналом необходимо в index задавать значение _NTO_SIDE_CHANNEL. Это обеспечивает получение для соединения значения ID большего, чем значение ID любого существующего дескриптора файла. Если _NTO_SIDE_CHANNEL не используется, возможны следующие последствия:

Если дескриптор файла со значением 0 используется, а 1 не используется, то когда вызывается ConnectAttach() с установленным в index значением 0, то возвращается ID соединения, равный 1. Так как дескриптор файла 1 в системе используется как stdout, то при выполнении процессом, например, функции printf() символьная строка будет послана каналу, с которым установлено соединение. Подобные ситуации могут случаться и тогда, когда ID соединения принимают значения 0 (stdin) и 2 (stderr).

Дочерний процесс может наследовать дескрипторы файлов родителя. При этом соединение, созданное родителем без использования _NTO_SIDE_CHANNEL в index и _NTO_COF_CLOEXEC в аргументе flags, наследуется дочерним процессом как дескриптор файла (путем дублирования дескрипторов файлов родителя). В процессе дублирования соединения как дескриптора файла серверу посылается системное сообщение _IO_DUP (первые 2 байта этого сообщения есть 0x115), в то время как сервер такого сообщения не ожидает.

Соединения, принадлежащие клиенту, могут использоваться одновременно любой нитью клиента.

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