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

На консоли процесса, который записывает данные:

This process writes to file!

Process wrote string: The sun is shining!

На консоли процесса, который читает данные:

This process reads from file!

Process read from file /net/QNX1/home/sam/file.txt: "The sun is shining!"

2.4. Передача сообений через неименованный канал по сети.

Чтобы передать сообщения таким способом,  необходимо знать номер узла, на котором запущен сервер, его pid и id канала, по которому ведётся обмен.

При локальной передаче достаточно 2 последних характеристик.

Текст сервера:

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <signal.h>

#include <unistd.h>

#include <sys/neutrino.h>

int channelId;

void SigintHandler( int signo );

int main(int argc, char *argv[])

{

setbuf( stdout, NULL );

signal( SIGINT, SigintHandler);

// создаём буферы для обмена сообщениями

char receiveBuff[256];

char replyBuff[256];

// Создание канала для обмена сообщениями

if (( channelId = ChannelCreate(0) )==-1) {

printf( "Server: create channel error!\n" );

exit(1);

}

// определяем номер канала и id сервера

printf( "Server: create channel. CH_ID=%d, PID=%d\n", channelId, getpid() );

// Принимаем в цикле сообщение

while (1)

{

int rcvId = MsgReceive( channelId, receiveBuff, sizeof(receiveBuff), NULL );

// анализируем, что возвращает нам функция MsgReceive

switch (rcvId)

{

// Ошибка

case -1:

printf( "Server: MsgReceive error.\n" );

break;

// Если пульс, принимаем пульс

case 0:

printf( "Server: Receive pulse.\n" );

break;

// Если сообщение, принимаем сообщение и отвечаем

default:

printf( "Server: Receive msg.\n" );

printf( "Server: msg - <%s>\n", receiveBuff );

sprintf( replyBuff, "Server reply to client RCV_ID=%d", rcvId );

MsgReply( rcvId, EOK, replyBuff, sizeof(replyBuff));

break;

}

}

return EXIT_SUCCESS;

}

// обработчик для уничтожения сигнала

void SigintHandler( int signo ) {

ChannelDestroy( channelId );

exit( EXIT_SUCCESS );

}

Текст клиента:

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <signal.h>

#include <sys/neutrino.h>

#include <sys/netmgr.h>

void SigintHandler( int signo );

int connectId;

int main(int argc, char *argv[])

{

setbuf( stdout, NULL );

signal( SIGINT, SigintHandler);

char sendBuff[256];

char replyBuff[256];

int channelId, ownerPid, nd;

// преобразуем аргументы командной строки в нужный нам формат

channelId = atoi( argv[1] );

ownerPid = atoi( argv[2] );

nd = netmgr_strtond( argv[3], NULL );

// присоединяемся к каналу

connectId = ConnectAttach( nd, ownerPid, channelId, 0, 0 );

if (connectId == -1 ){

printf( "Client: ConnectAttach error!" );

exit(2);

}

// отправляем сообщение

while (1) {

printf( "Message: " );

scanf( "%s", sendBuff );

if( MsgSend( connectId, sendBuff, sizeof(sendBuff),replyBuff,sizeof(replyBuff) )==-1) {

printf( "Client: MsgSend error!" );

exit(3);

}

printf( "Client: Reply msg - <%s>\n", replyBuff );

}

return EXIT_SUCCESS;

}

void SigintHandler( int signo ) {

ConnectDetach( connectId );

exit( EXIT_SUCCESS );

}

Данный тип обмена сообщениями имеет недостаток – нужно заранее знать, на каком узле находится сервер, что не всегда возможно. Поэтому гораздо удобнее использовать именованные каналы.


Проектирование с использованием IDE

3.1 Сборка отладочного комплекса (кросс-системы):

3.1.1 Установка (инсталляция) среды IDE Momentics на инструментальной                                             машине под ОС Windows или Linux

Установка ОС QNX на удаленной целевой платформе реальной  или виртуальной

Установка