Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер, страница 12

int         res, i;                       // промежуточные переменные

int   coid;                   // Идентификатор канала сервера

float       smsg [102];             // Буфер отправляемого сообщения

float       rmsg [1000];            // Буфер принимаемого сообщения

FILE*       finp;                   // Указатель на файл исходных данных

FILE* foutp;                        // Указатель на файл результатов

// Открытие файла ввода

finp=fopen("/home/mary/Interp/inp.txt","r");

if (finp==NULL)

{

printf ("Error #6: Can't open input file %s.", argv [1]);

return 6;

}

// Считывание данных из файла ввода

res=fscanf(finp," %d %d",&p_numb, &i_numb);

if (res!=2)

{

printf("Error #3: Can't get point numbers.");

return 3;

}

// Проверка допустимости значения количества исходных точек

if ((p_numb<2)||(p_numb>50))

{

printf("Error #4: Data points number must be numeric in [2..50].");

return 4;

}

// Проверка допустимости количества требуемых точек

if ((i_numb<2)||(i_numb>500))

{

printf("Error #5: Data points number must be numeric in [2..500].");

return 5;

}

// Загрузка количества точек в буфер передачи

smsg[0]=p_numb;

smsg[1]=i_numb;

// Считывание исходных точек из файла в буфер передачи

for (i=2;i<p_numb*2+2;i++)

{

res=fscanf(finp, " %f", &smsg[i]);

if (res !=1)

{

printf ("Error #7: Can't get points from file '%s'",argv[1]);

return 7;

}

}

// Закрытие файла ввода

fclose(finp);

// Подключение к именованному каналу

coid = name_open("int_server", NAME_FLAG_ATTACH_GLOBAL);

if (coid == -1)

{

printf("Error #2: Can't find server 'int_server'\n");

return 2;

}

// Отправка сообщения серверу

MsgSend(coid, smsg, (p_numb*2+2)*sizeof(float), rmsg, i_numb*sizeof(float)*2);

// Открытие файла результатов

foutp=fopen("/home/mary/Interp/outp.txt","w");

if (foutp==NULL)

{

printf ("Error #9: Can't open output file %s.",argv [2]);

return 9;

}

// Вывод результатов интерполяции в консоль и файл

printf("Time\tValue\n");

for (i=0;i<i_numb;i++)

{

printf ("%8.3f\t%8.3f\n",rmsg[2*i],rmsg[2*i+1]);

fprintf (foutp,"%8.3f\t%8.3f\n",rmsg[2*i],rmsg[2*i+1]);

}

// Закрытие файла вывода результатов

fclose (foutp);

// Успешный выход из программы

return 0;

}

Текст interp_server.c.

#include <stdio.h>

#include <errno.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <unistd.h>

// Прототип функции интерполяции

void interpolate(int p_numb, int i_numb, float* data, float* result);

// Основная функция проекта

int main(void)

{

int               rcvid;                  // ID клиента

float                   msg_buf[1002];    // Буфер приёма и передачи

name_attach_t     *res;             // Информация о клиенте

int               p_numb;                 // Количество требуемых! точек

// Создание именованного канала

res = name_attach(NULL, "int_server", NAME_FLAG_ATTACH_GLOBAL );

if (res==NULL)

{

printf("Error #%d: Cant't create channel\n", errno);

return 1;

}

else

printf ("Server's channel created\n");

// Цикл обработки сообщений от клиента

while(1)

{

// приём сообщения в буфер msg_buf

rcvid = MsgReceive(res->chid, &msg_buf[0], 102*sizeof(float), NULL);

if (rcvid > 0)

{

p_numb= msg_buf[1];

// Интерполяция

interpolate (msg_buf[0], msg_buf[1], &msg_buf[2], msg_buf);

// Отправка результата клиенту

MsgReply(rcvid,p_numb*sizeof(float),msg_buf,p_numb*2*sizeof(float));

}

}

return 0;

}

Тексты программ приведены для сетевой организации (клиент и сервер – разные машины), для локальной реализации следует изменить флаг глобальной передачи:

в сервере:

изменить параметр 3 в функции name_attach на 0