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

return EXIT_FAILURE;

}

}

return EXIT_SUCCESS;}

Посмотрим результаты работы:

После запуска программы на командной строке увидим:

FATHER STARTED!

THIS MESSAGE POSTED SON

FATHER RECEIVED MESSAGE: "Hello!!! This message from child!"

This is reply from father: "Hello, Son. I received your message!"

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

Теперь сделаем, чтобы процесс-отец был клиентом и отправлял сообщение, а процесс-сын был сервером.

Ниже представлен текст программы:

// пытаемся сделать процесс сын сервером

#include <stdlib.h>

#include <stdio.h>

#include <process.h>

#include <errno.h>

#include <sys/neutrino.h>

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

int chid;         // ID КАНАЛА

int rcvid;        // КОМУ ОТВЕЧАТЬ

/* ПРОЦЕСС-РЕБЁНОК ПРИНИМАЕТ СООБЩЕНИЕ И ОТПРАВЛЯЕТ ОТВЕТ*/

if (fork()==0){

// БУФЕРЫ ДЛЯ ОТПРАВЛЯЕМОГО СООБЩЕНИЯ И ОТВЕТА

char receivebuf[64];

char replybuf[64];

printf("SON STARTED!\n");

chid=ChannelCreate(0);

rcvid = MsgReceive(chid,receivebuf,sizeof(receivebuf),NULL);

if (rcvid > 0){

printf("SON RECEIVED MESSAGE: \"%s\"\n",&receivebuf);

strcpy(replybuf,"Hello,Father. I received your                           message!\n");

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

else{

printf("ERROR: MsgReceive failed\n");

return EXIT_FAILURE;

}

}

else{

// ПРОЦЕСС-ОТЕЦ ОТПРАВЛЯЕТ СООБЩЕНИЕ

// БУФЕРЫ

char sendbuf[64];

char replybuf[64];

// ИДЕНТИФИКАТОР СОЕДИНЕНИЯ

int coid;

// ОТКРЫВАЕМ КАНАЛ

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

if (coid > 0){

// тЕКСТ СООБЩЕНИЯ

strcpy(sendbuf," Hello!!! This message from father!\n");

MsgSend(coid, sendbuf, sizeof(sendbuf),replybuf,sizeof(replybuf) );

printf("This is reply from father: \"%s\"\n",&replybuf);

}

else {

printf("ERROR: ConnectAttach failed\n");

return EXIT_FAILURE;

}

}

return EXIT_SUCCESS;

Запустим программу и посмотрим результат:

Видим, что получили ошибку. Это связано с тем, что сервер должен всегда запускаться первым и создавать канал для обмена сообщениями.

2.1.2. Локальные независимые процессы.

Для такой передачи нам необходимо создать 2 процесса: клиент и сервер. Клиент будет отправлять сообщение серверу, а сервер будет принимать сообщение и посылать ответ.

Здесь для передачи сообщения будем использовать неименованный канал.

Функция для создания неименованного канала – ConnectAttach(), которой передаются 3 идентификатора: дескриптор узла, идентификатор процесса и идентификатор канала. Вместе эти три идентификатора однозначно идентифицируют сервер, с которым клиент желает соединиться. Присвоением идентификатору узла нулевого значения мы сообщаем ядру, что желаем установить соединение на локальном узле.

В программе-сервере будем определять идентификатор и записывать его в файл. Программа-клиент будет считывать идентификатор процесса-сервера из файла.

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

#include <stdio.h>

#include <sys/neutrino.h>

#include<errno.h>

#include<stdlib.h>

int main(void) {

FILE* pFile;

int pid;

pFile=fopen ("out.txt","r");

fscanf(pFile,"%d",&pid);

printf("pid_server: %d\n",pid);

fclose(pFile);

char *smsg = "HELLO, WORLD!!!";

char rmsg[200];

int coid;

coid=ConnectAttach(0,pid,1,0,0);

if (coid==-1) {

fprintf(stderr,"ERROR CONNECT ATACH!\n");

perror(NULL);

exit(EXIT_FAILURE);

}

if (MsgSend (coid,smsg,sizeof(smsg) +1,rmsg,sizeof(rmsg))==-1){

fprintf(stderr,"ERROR MSGSEND!");

perror(NULL);

exit(EXIT_FAILURE);}

if(strlen(rmsg)>0){