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

printf("REPLY:\"%s\"\n",rmsg);

}

}

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

# include <stdio.h>

#include <sys/neutrino.h>

#include<errno.h>

#include<stdlib.h>

int main(){

int pid=getpid();

FILE * pFile;

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

fprintf(pFile,"%d\n",pid);

fclose(pFile);

int rcvid;

int chid;

char message[512];

chid=ChannelCreate(0);

while(1){

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

printf("receive message,rcvid %X\n",rcvid);

printf("message: \"%s\".\n",message);

strcpy(message,"reply");

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

}}

Посмотрим результат программы в QNX:

Видим, что сервером принято сообщение и отправлен ответ.

Теперь запустим первым клиент и посмотрим, что будет:

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

2.1.3. Сетевые независимые процессы.

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

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

#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 "msg_header.h"

void sig_int(void);

name_attach_t *attach;

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

int rcvid;

msg_my_t msg_rcv, msg_rpl;

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

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, &msg_rcv, sizeof(msg_rcv), NULL);

if(rcvid > 0){

printf("Receive message %d: %s\n, msg_rcv.mes);

strcpy(msg_rpl.mes,"Transfer is qood!");

msg_rpl.length=strlen(msg_rpl.mes);

MsgReply(rcvid, EOK, &msg_rpl, sizeof(msg_rpl));

}

else if(rcvid == -1){

printf("ERROR: MsgReceive\n");

}

}

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 "../msg_local_server/msg_header.h"

int main(void){

int coid;

int count=0;

msg_my_t msg_send, msg_reply;

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());

}

while(1){

gets(msg_send.mes);

if(MsgSend(coid, &msg_send, sizeof(msg_send), &msg_reply, sizeof(msg_reply)) == -1){

printf("Error send MSG\n");

}

else{

printf("Reply: %s\n",msg_reply.mes);

}

}

}

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

На консоли сервера:

SERVER STARTED

Receive message: _

Receive message: hello

Видим, что при подключении к каналу сначала передаётся пульс, а потом только наше сообщение.

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

START CLIENT pid #495654

hello

Reply: Transfer is qood!

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

2.1.4. Потоки одного процесса.

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

#include <stdlib.h>

#include <stdio.h>

#include <signal.h>

#include <pthread.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <sys/neutrino.h>

#include <string.h>

#include <errno.h>

#include "header.h"

name_attach_t *attach;

void sig_int(void){

printf("Terminate SERVER\n");