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

name_detach( attach, 0 );

exit(EXIT_SUCCESS);

}

void* thread1(void* args)

{

int rcvid;

msg_my_t msg_rcv, msg_rpl;

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

attach = name_attach(NULL, ATTACH_POINT, 0 );

if (attach == NULL){

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

//return EXIT_FAILURE;

return;

}

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 from %d: %s\n", rcvid, 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;

return;

}

void* thread2(void* args)

{

int coid;

msg_my_t msg_send, msg_reply;

coid = name_open( ATTACH_POINT, 0);

if(coid == -1){

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

//return EXIT_FAILURE;

return;

}

else{

printf("Cliet started pid #%d\n",getpid());

}

while(1){

gets(msg_send.mes);

//strcpy(msg_send.mes,"hello");

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

}

}

}

int main (void)

{

pthread_t th1, th2;

pthread_create(&th1,NULL,thread1,NULL);

printf("thread1 created\n");

pthread_create(&th2,NULL,thread2,NULL);

printf("thread2 created\n");

pthread_join(th1,NULL);

printf("thread1 joined\n");

pthread_join(th2,NULL);

printf("thread2 joined\n");

return 0;

}

Результаты:

Если отправка осуществляется одноразово:

Состояние потоков:

Завершение сервера:

Если отправка осуществляется в цикле:

Состояние потоков:


2.2. Пульсы.

Пульс – это один из вариантов IPC. Если получен пульс, то функция MsgReceive() возвратит получателю 0. Передача импульса осуществляется следующей функцией:

Int MsgSendPulse(int coid, int priority, int code, int value ).

Приём пульсов может производиться функцией для приёма сообщений либо специальной функцией для приёма пульсов.

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

2.2.1.1. Родственные процессы.

Процесс-сын отправляет пульс, а процесс-отец принимает.

При приёме сообщения процесс-отец должен проанализировать, что возвращает функция MsgReceive();

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

}

else {

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

return EXIT_FAILURE;

}

}

else{

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

char replybuf[64];

struct _pulse my_pulse;

printf("father started\n");

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

if (rcvid > 0){

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

printf("father: msg received\n");

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

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

}

else if (rcvid == 0){

//ЭТО ПУЛЬС

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

}

else{

//ОШИБКА

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

return EXIT_FAILURE;

}

}

return EXIT_SUCCESS;

}

Результаты программы:

father started

child started

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

Запускается процесс-отец, запускается процесс-сын, который отправляет пульс процессу-отцу. Затем процесс-отец выводит значение и код принятого пульса на экран.