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

2.2.1.2.Независимые процессы (сетевая реализация).

Сервер анализирует, что возвращает функция MsgReceive().

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

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <sys/neutrino.h>

#include <string.h>

#include <errno.h>

#include "header.h"

void sig_int(void);

name_attach_t *attach;

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

char replybuf[64];

struct _pulse my_pulse;

int rcvid;

// СОЗДАЁМ КАНАЛ ДЛЯ ОБМЕНА СООБЩЕНИЯМИ

attach = name_attach(NULL, ATTACH_POINT,NAME_FLAG_ATTACH_GLOBAL);

if (attach == NULL){

printf("ERROR: %s\n",strerror(errno));

return EXIT_FAILURE;

}

else{

signal(SIGINT,sig_int);

printf("SERVER STARTED\n");

}

// ЖДЁМ СООБЩЕНИЯ

while(1){

rcvid = MsgReceive(attach->chid,&my_pulse,sizeof(my_pulse),NULL);

if (rcvid > 0){

//ЭТО СООБЩЕНИЕ

if (my_pulse.type = _IO_CONNECT){

MsgReply(rcvid,EOK,NULL,0);

continue;

}

else{

printf("server: msg received from %d\n", rcvid);

strcpy(replybuf,"Transfer is qood!\n");

MsgReply(rcvid,EOK,replybuf,sizeof(replybuf));

}

}

else if (rcvid == 0){

//ЭТО ПУЛЬС

printf("server: received pulse: code=%d; value=%d;\n",my_pulse.code,my_pulse.value.sival_int);

}

else{

//ОШИБКА

printf("server: transfer failed\n");

return EXIT_FAILURE;

}

}

return EXIT_SUCCESS;

}

void sig_int(void){

printf("Terminate SERVER\n");

name_detach( attach, 0 );

exit(EXIT_SUCCESS);

}

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

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/dispatch.h>

#include "header.h"

int main(void){

int coid;

coid = name_open( ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL);

if(coid == -1){

printf("can not find server\n");

return EXIT_FAILURE;

}

else{

printf("START CLIENT pid #%d\n",getpid());

}

MsgSendPulse(coid, 12, 5, 1);

printf("client: pulse sending\n");

}

Текст хидера, в котором определено имя канала, по которому происходит обмен:

#include <sys/dispatch.h>

#ifndef MSG_HEADER_H_

#define MSG_HEADER_H_

#define ATTACH_POINT "pulse_server"

#define lenmes 256

#endif /* MSG_HEADER_H_ */

Результаты:

Консоль клиента:

START CLIENT pid #802854

client: pulse sending

Консоль сервера

SERVER STARTED

server: received pulse: code=5; value=1;

server: received pulse: code=-33; value=0;

При отсоединении от канала тоже передаётся пульс с значением 0 и кодом -33.

2.2.2. Реализация пульсов специальными средствами (родственные процессы).

Теперь сервер не должен анализировать, что он принимает. Ему заранее известно, что придёт пульс.

Текст программы:

#include <stdlib.h>

#include <stdio.h>

#include <process.h>

#include <errno.h>

#include <sys/neutrino.h>

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

int chid;

int rcvid;

//СОЗДАЕМ КАНАЛ

chid=ChannelCreate(0);

if (fork()==0){

//ПРОЦЕСС-СЫН

int coid;

printf("child started\n");

//ПОДСОЕДИНЯЕМСЯ К КАНАЛУ

coid=ConnectAttach( 0, getppid(), chid, 0, 0 );

if (coid > 0){

MsgSendPulse(coid, 12, 5, 8);

printf("child: pulse sending\n");

}

else {

printf("Error: connection failed\n");

return EXIT_FAILURE;

}

}

else{

//ПРОЦЕСС-ОТЕЦ

struct _pulse my_pulse;

printf("father started\n");

rcvid = MsgReceivePulse(chid,&my_pulse,sizeof(my_pulse),NULL);

if (rcvid == -1){

printf("father: MsgReceivePulse failed\n");

return EXIT_FAILURE;

}

else {

printf("father: received pulse: code=%d; value=%d;",my_pulse.code,my_pulse.value.sival_int);

}

}

return EXIT_SUCCESS;

}

Результаты:

father started

child started

child: pulse sending

father: received pulse: code=5; value=8;