Установить соединение между процессом и каналом
#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_LOCAL_NODE
для локального узла), на котором запущен процесс, владеющий каналом; смотрите “Дескрипторы узлов” ниже. Обработка соединения как файлового дескриптора может привести к непредсказуемому поведению. Поэтому при создании соединения следует использовать ИЛИ с _NTO_SIDE_CHANNEL для index. В этом случае возвращаемый идентификатор соединения не попадает в область файловых дескрипторов; получаемый идентификатор будет больше, чем любой корректный файловый дескриптор. После создания нет никакой разницы в использовании примитивов обмена сообщениями для этого идентификатора. Библиотека C создает соединения в различное время без использования _NTO_SIDE_CHANNEL (например, во время open()), однако маловероятно, что какое-либо приложение захочет использовать полученный дескриптор как файловый. |
_NTO_COF_CLOEXEC
, соединение закрывается, если процесс вызывает функцию exec*() для запуска нового процесса.libc
Вызовы ядра ConnectAttach() и ConnectAttach_r() устанавливают соединение между вызывающим процессом и каналом, определяемым chid, которым владеет процесс pid на узле nd. Любая функция, передающая дескриптор узла, может использовать значение 0
или константу ND_LOCAL_NODE
, чтобы указать, что узел является локальным.
Данные функции идентичны за исключением способа возврата ошибок.
Если процесс желает, чтобы другие процессы могли взаимодействовать с ним, он обычно использует name_attach() для создания канала и связывания с ним некоторого имени, а процесс-отправитель использует name_open() для определения этого имени и создания соединения с ним. |
Возвращаемое значение - идентификатор соединения, короткое целое число, описывающее соединение. Система возвращает первый доступный идентификатор соединения, начинающийся с аргумента index. Любой поток в вызывающем процессе может использовать либо MsgSendv() для посылки сообщения, либо MsgSendPulse() для посылки импульса по соединению. Идентификатор соединения используется непосредственно как файловый дескриптор POSIX (fd) при взаимодействии с менеджерами ресурсов ввода/вывода, такими как менеджер файловой системы.
Если ИЛИ с _NTO_SIDE_CHANNEL
не используется для index, поведение функции может быть следующим:
0
, не используется файловый дескриптор
, а также вызывается ConnectAttach() с 0
в качестве индекса, возвращается идентификатор соединения 1
.
Файловый дескриптор 1
(идентификатор соединения 1
) используется как stdout, в который printf() совершает вывод. Если процесс вызывает printf(), завершаемые NULL
символьные строки отправляются в канал, с которым установлено соединение. Аналогичная ситуация происходит с идентификаторами соединения 0
( stdin) и 2
( stderr).
Поскольку соединения обрабатываются как файловые дескрипторы, соединение, созданное без _NTO_SIDE_CHANNEL
в index и без _NTO_COF_CLOEXEC
в flags, заставляет дочерний процесс унаследовать соединение во время его создания. Это наследование выполняется во время создания процесса путем дублирования файловых дескрипторов.
Во время дублирования получателю на другой стороне соединения отправляется сообщение _IO_DUP
(с 0x115
в качестве первых 2 байтов). Получатель не будет ожидать это сообщение.
Если для индекса установлен _NTO_SIDE_CHANNEL
, то индекс игнорируется, а возвращаемый идентификатор соединения является первым доступным индексом в пространстве _NTO_SIDE_CHANNEL
.
Если процесс создает несколько соединений для одного и того же канала, система поддерживает подсчет ссылок и разделяемые внутренние ресурсы объекта ядра для эффективности.
Соединения принадлежат процессу и могут одновременно использоваться любыми потоками в процессе. Завершить соединение можно с помощью вызова ConnectDetach(). Если какой-то поток заблокирован на канале через MsgSendv() во время завершения соединения, отправка завершается с ошибкой.
Соединения и идентификаторы соединений существуют до вызова ConnectDetach(), даже если остальные процессы завершились. |
Соединение строго локальное (то есть не доступно по сети) и становится доступным при первом использовании идентификатора соединения.
Данные вызовы не блокируются.
nd (дескриптор узла) - временное числовое значение удаленного узла.
Для того, чтобы: | Используйте функцию: |
---|---|
Сравнить два дескриптора узла | ND_NODE_CMP() |
Сконвертировать дескриптор узла в текст | netmgr_ndtostr() |
Сконвертировать текст в дескриптор узла | netmgr_strtond() |
-1
и устанавливает errno.
ЗОСРВ «Нейтрино»
ChannelCreate(), ConnectDetach(), execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), MsgSendPulse(), MsgSendv(), name_attach(), name_open(), netmgr_remote_nd()
Предыдущий раздел: Описание API системной библиотеки