ConnectAttach(), ConnectAttach_r()

Установить соединение между процессом и каналом

Прототип:

#include <sys/neutrino.h>
#include <sys/netmgr.h>
int ConnectAttach( uint32_t nd,
pid_t pid,
int chid,
unsigned index,
int flags );
int ConnectAttach_r( uint32_t nd,
pid_t pid,
int chid,
unsigned index,
int flags );

Аргументы:

nd
Дескриптор узла (например, ND_LOCAL_NODE для локального узла), на котором запущен процесс, владеющий каналом; смотрите “Дескрипторы узлов” ниже.
pid
Идентификатор процесса-владельца канала. Если pid равен нулю, предполагается, что это вызывающий процесс.
chid
Идентификатор канала, возвращаемый ChannelCreate(), который нужно соединить с процессом.
index
Минимально допустимый идентификатор соединения.

Note: Обработка соединения как файлового дескриптора может привести к непредсказуемому поведению. Поэтому при создании соединения следует использовать ИЛИ с _NTO_SIDE_CHANNEL для index. В этом случае возвращаемый идентификатор соединения не попадает в область файловых дескрипторов; получаемый идентификатор будет больше, чем любой корректный файловый дескриптор.

После создания нет никакой разницы в использовании примитивов обмена сообщениями для этого идентификатора. Библиотека C создает соединения в различное время без использования _NTO_SIDE_CHANNEL (например, во время open()), однако маловероятно, что какое-либо приложение захочет использовать полученный дескриптор как файловый.

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

Библиотека:

libc

Описание:

Вызовы ядра ConnectAttach() и ConnectAttach_r() устанавливают соединение между вызывающим процессом и каналом, определяемым chid, которым владеет процесс pid на узле nd. Любая функция, передающая дескриптор узла, может использовать значение 0 или константу ND_LOCAL_NODE, чтобы указать, что узел является локальным.

Данные функции идентичны за исключением способа возврата ошибок.


Note: Если процесс желает, чтобы другие процессы могли взаимодействовать с ним, он обычно использует name_attach() для создания канала и связывания с ним некоторого имени, а процесс-отправитель использует name_open() для определения этого имени и создания соединения с ним.

Возвращаемое значение - идентификатор соединения, короткое целое число, описывающее соединение. Система возвращает первый доступный идентификатор соединения, начинающийся с аргумента index. Любой поток в вызывающем процессе может использовать либо MsgSendv() для посылки сообщения, либо MsgSendPulse() для посылки импульса по соединению. Идентификатор соединения используется непосредственно как файловый дескриптор POSIX (fd) при взаимодействии с менеджерами ресурсов ввода/вывода, такими как менеджер файловой системы.

Если ИЛИ с _NTO_SIDE_CHANNEL не используется для index, поведение функции может быть следующим:

Если для индекса установлен _NTO_SIDE_CHANNEL, то индекс игнорируется, а возвращаемый идентификатор соединения является первым доступным индексом в пространстве _NTO_SIDE_CHANNEL.

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

Соединения принадлежат процессу и могут одновременно использоваться любыми потоками в процессе. Завершить соединение можно с помощью вызова ConnectDetach(). Если какой-то поток заблокирован на канале через MsgSendv() во время завершения соединения, отправка завершается с ошибкой.


Note: Соединения и идентификаторы соединений существуют до вызова ConnectDetach(), даже если остальные процессы завершились.

Соединение строго локальное (то есть не доступно по сети) и становится доступным при первом использовании идентификатора соединения.

Состояния блокировки:

Данные вызовы не блокируются.

Дескрипторы узлов

nd (дескриптор узла) - временное числовое значение удаленного узла.

Для того, чтобы: Используйте функцию:
Сравнить два дескриптора узла ND_NODE_CMP()
Сконвертировать дескриптор узла в текст netmgr_ndtostr()
Сконвертировать текст в дескриптор узла netmgr_strtond()

Возвращаемое значение:

ConnectAttach()
Идентификатор соединения, используемый для сообщений. В случае ошибки функция возвращает -1 и устанавливает errno.
ConnectAttach_r()
Идентификатор соединения, используемый для сообщений. Данная функция НЕ устанавливает errno. В случае ошибки функция возвращает отрицательное значение из списка ошибок.

Коды ошибок:

EAGAIN
Недостаточно ресурсов.
EINVAL
Одна из следующих причин:
EMFILE
У процесса не осталось свободных файловых дескрипторов, либо нет доступных файловых дескрипторов, равных или превышающих значение index.
ENOREMOTE
Узел, определяемый nd, не существует.
ENXIO
Процесс, определяемый pid, больше не существует. Он завершен, вызвал сброс памяти или стал зомби.
ESRCH
Процесс, определяемый pid, или канал, определяемый chid, не существует.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

ChannelCreate(), ConnectDetach(), execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), MsgSendPulse(), MsgSendv(), name_attach(), name_open(), netmgr_remote_nd()




Предыдущий раздел: Описание API системной библиотеки