Разделение файловых дескрипторов между процессами 

В традиционных Unix системах существует редко используемая, но довольно удобная возможность передавать файловый дескриптор между процессами с помощью Unix domain sockets (uds). Если вы не знакомы с понятием uds, то вкратце это можно описать как комбинацию из стандартных каналов (pipe) и сокетов (sockets). Используя uds вы имеете в своем распоряжении все преимущества работы с локальными двунаправленными каналами (скорость межпроцессорного взаимодействия в первую очередь) и при этом вы можете применять все стандартные функции работы с сокетам.

Звучит неплохо, не правда ли? И хотя Unix domain sockets (AF_LOCAL/AF_UNIX) не поддерживаются напрямую в QNX Neutrino 6.1, в богатом выборе других механизмов межпроцессорного взаимодействия отсутствует только возможность передачи файловых дескрипторов между процессами. В данной статье описывается как можно восполнить этот пробел, правда, с небольшими ограничениями.

[Примечание: Unix domain sockets доступны в QNX Neutrino начиная с версии 6.2.0. Но данная статья не потеряла из-за этого своей ценности, так что продолжайте читать!]

Как это работает

Самое главное, о чем нужно помнить, это то, что получение файлового дескриптора процессом (или идентификатора канала связи в представлении QNX) включает в себя установку связи клиентским процессом по каналу, который был создан процессом – сервером. После этого по установленному каналу связи клиент посылает сообщение (как правило, _IO_CONNECT_OPEN) , которое принимается и обрабатывается сервером. В процессе обработки производятся всевозможные проверки – контроль доступа, проверка пути на существование, и тому подобное. В случае успешного вызова функции open() сервер привяжет клиентское соединение к некоторой внутренней структуре менеджера ресурсов и эта привязка будет использоваться для обработки всех последующих сообщений (_IO_READ, _IO_WRITE, и тому подобное).

В монолитной операционной системе, в которой, как правило, существует всего одна центральная виртуальная файловая система (virtual file system — vfs) используемая для поддержки всех других файловых систем, отображение файлового дескриптора одного процесса на файловый дескриптор другого процесса может быть осуществлено довольно просто.

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