Рассмотрим две сущности ("клиент" и "сервер"), между которыми установлен IPC-канал. Пусть cl
— клиентский IPC-дескриптор этого канала, sr
— серверный IPC-дескриптор этого канала.
Приведенный ниже код предназначен для демонстрации механизма IPC. Обычно в коде сущности системные вызовы не используются напрямую. Для удобного обмена сообщениями предназначены специальные NK-сгенерированные методы, которые, в свою очередь, используют системные вызовы.
Код сущности-клиента:
client.c
…
// Получение клиентского IPC-дескриптора cl с помощью локатора сервисов
…
// Отправка запроса
Call(cl, &RequestBuffer, &ResponseBuffer);
…
Код сущности-сервера:
server.c
…
// Получение серверного IPC-дескриптора sr с помощью локатора сервисов
…
// Получение запроса
Recv(sr, &RequestBuffer);
…
// Обработка запроса
…
// Отправка ответа
Reply(sr, &ResponseBuffer);
…
Обмен сообщениями происходит следующим образом:
Call()
, передав в аргументах дескриптор cl
(клиентский дескриптор используемого канала), указатель на буфер с сообщением-запросом и указатель на буфер для ответа.Call()
завершается с кодом ошибки rcSecurityDisallow
, переходим к пункту 9.Recv()
, передав первым аргументом sr
), переходим к пункту 4. В противном случае поток клиента остается заблокированным до тех пор, пока один из потоков сервера не выполнит системный вызов Recv()
с первым аргументом sr
.Recv()
завершается с кодом rcOk
.Reply()
, передав в аргументах дескриптор sr
и указатель на буфер с сообщением-ответом.Call()
и Reply()
завершаются с кодом ошибки rcSecurityDisallow
(см. пункт 3).Reply()
завершается с кодом rcOk
. Поток клиента разблокируется, вызов Call()
завершается с кодом rcOk
.Если в процессе передачи запроса произошла ошибка (нехватка памяти, неверный формат сообщения и т.п.), то потоки разблокируются, а вызовы Call()
и Reply()
возвращают код ошибки.