Что такое функционирование в «Реальном масштабе времени»


Download 1.86 Mb.
Pdf ko'rish
bet60/72
Sana19.04.2023
Hajmi1.86 Mb.
#1362511
TuriУчебное пособие
1   ...   56   57   58   59   60   61   62   63   ...   72
Bog'liq
Луканов А.С. Системы реального времени 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:
1   ...   56   57   58   59   60   61   62   63   ...   72




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling