Установить соединение между процессом и каналом
#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 системной библиотеки