Что такое функционирование в «Реальном масштабе времени»
Download 1.86 Mb. Pdf ko'rish
|
Луканов А.С. Системы реального времени 2020
Установление соединения Первое, что должны сделать — это установить соединение с помощью функции ConnectAttach(), описанной следующим образом: #include int ConnectAttach (int nd,pid_t pid, int chid, unsigned index, int flags); Функции ConnectAttach() передаются три идентификатор: · nd – дескриптор узла (Node Descriptor), · pid – идентификатор процесса (process ID), · chid – идентификатор канала (channel ID). Вместе эти три идентификатора, которые обычно записываются в виде «ND/PID/CHID», однозначно идентифицируют сервер, с которым клиент желает соединиться. Аргументы index и flags мы здесь просто проигнорируем (установим их в ноль). Итак, предположим, что мы хотим подсоединиться к процессу, находящемуся на нашем узле и имеющему идентификатор 77, по каналу с идентификатором 1. Ниже приведен пример программы для выполнения этого: int coid; coid = ConnectAttach (0, 77 „ 1, 0, 0); Можно видеть, что присвоением идентификатору узла (nd) нулевого значения мы сообщаем ядру о том, что мы желаем установить соединение на локальном узле. Соединиться надо с процессом 77 и по каналу 1. 127 С этого момента есть идентификатор соединения – небольшое целое число, которое однозначно идентифицирует соединение моего клиента с конкретным сервером по заданному каналу. Теперь можно применять этот идентификатор для отправки запросов серверу сколько угодно раз. Выполнив все, для чего предназначалось соединение, его можно уничтожить с помощью функции: ConnectDetach (coid); Передача сообщений (sending) Передача сообщения со стороны клиента осуществляется применением функции MsgSend(). Мы рассмотрим это на примере: #include int MsgSend (int coid, const void *smsg, int sbytes, void *rmsg, int rbytes); Аргументами функции MsgSendQ являются: · идентификатор соединения с целевым сервером (coid); · указатель на передаваемое сообщение (smsg); · размер передаваемого сообщения (sbytes); · указатель на буфер для ответного сообщения (rmsg); · размер ответного сообщения (rbytes). Передадим сообщение процессу с идентификатором 77 по каналу 1: #include char *smsg = « Это буфер вывода»; char rmsg [200]; int coid; // Установить соединение coid = ConnectAttach (0, 77, 1, 0, 0); if (coid == -1) { fprintf (stderr, « Ошибка ConnectAttach к 0/77/1!\n»); perror (NULL); exit (EXIT_FAILURE); // Отправить сообщение if(MsgSend(coid, smsg,strlen (smsg) + 1,rmsg,sizeof(rmsg)) == -1) 128 { fprintf (stderr, « Ошибка MsgSendXn») ; perror (NULL) ; exit (EXIT_FAILURE) ; if (strlen (rmsg) > 0) { printf (« Процесс с ID 77 возвратил \«%s\»\n», rmsg); } Предположим, что процесс с идентификатором 77 был действительно активным сервером, ожидающим сообщение именно такого формата по каналу с идентификатором 1. После приема сообщения сервер обрабатывает его и в некоторый момент времени выдает ответ с результатами обработки. В этот момент функция MsgSendQ должна возвратить ноль (0), указывая этим, что все прошло успешно. Если бы сервер послал нам в ответ какие-то данные, мы смогли бы вывести их на экран с помощью последней строки в программе. Download 1.86 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling